首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不传递给DB助手类的Android变量

不传递给DB助手类的Android变量
EN

Stack Overflow用户
提问于 2015-03-20 13:31:09
回答 2查看 1.6K关注 0票数 0

我有一个应用程序,需要访问一个静态数据库,并运行基于用户输入的查询。我在用

JGil毡/android-sqlite helper

作为我的数据库助手类。我的主要活动有两个旋转器,用户可以使用它来缩小搜索范围。纺丝器分别返回名为mGenre和mDecade的字符串变量。在活动的底部是一个按钮继续进行。当按下按钮时,就会触发一个新的活动,该活动将随机显示一个歌曲标题。变量被传递给新的活动vi,这是putExtra()的意图。新活动接收变量,并在if/else语句中使用它们来决定从DB Helper运行哪个查询。

在DB助手类中,我创建了一个新类的实例,并将其用于设置mGenre和mDecade变量,以便使用rawQuery()的String[] args部分中的变量来运行正确的查询。

下面是当用户点击主活动的按钮时打开的songActivity类:

代码语言:javascript
复制
public class SongActivity extends ActionBarActivity {

    private MyDatabase db;
    private static  final String TAG = "We got ";

    String mGenre;
    String mDecade;


    public String getGenre() {
        return mGenre;
    }

    public String getDecade() {
        return mDecade;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_song);

        //when activity launches query database using user params

        mGenre = getIntent().getExtras().getString("Genre");
        mDecade = getIntent().getExtras().getString("Decade");
        Log.v(TAG, mGenre);
        Log.v(TAG, mDecade);

        String songTitle = "";
        String songArtist = "";
        String songYear = "";

        TextView mSongTitle = (TextView)findViewById(R.id.songTitle);
        TextView mSongArtist = (TextView)findViewById(R.id.songArtist);
        TextView mSongYear = (TextView)findViewById(R.id.songYear);




        db= new MyDatabase(this);




        if (mGenre.equals("*") && mDecade.equals("*")) {

            Cursor cursor = db.kamikazeSelected();
            cursor.moveToFirst();
            while (!cursor.isAfterLast()) {
                songTitle = cursor.getString(1);
                songArtist = cursor.getString(2);
                songYear = cursor.getString(4);
                Log.i(TAG, String.valueOf(songTitle));
                cursor.moveToNext();
            }
            cursor.close();
            db.close();

        }
        else if (!mGenre.equals("*") && mDecade.equals("*")) {
            Cursor cursor = db.genreSelected();

            cursor.moveToFirst();
            while (!cursor.isAfterLast()) {
                songTitle = cursor.getString(1);
                songArtist = cursor.getString(2);
                songYear = cursor.getString(4);
//                Log.i("cursor", cursor.getString(1));
                Log.i(TAG, String.valueOf(songTitle));
                cursor.moveToNext();
            }
            cursor.close();
            db.close();
        }

        else if (mGenre.equals("*") && !mDecade.equals("*")) {
            Cursor cursor = db.decadeSelected();
            cursor.moveToFirst();
            while (!cursor.isAfterLast()) {
                songTitle = cursor.getString(1);
                songArtist = cursor.getString(2);
                songYear = cursor.getString(4);
                Log.i(TAG, String.valueOf(songTitle));
                cursor.moveToNext();
            }
            cursor.close();
            db.close();
        }

        else if (!mGenre.equals("*") && !mDecade.equals("*")) {
            Cursor cursor = db.bothSelected();
            cursor.moveToFirst();
            while (!cursor.isAfterLast()) {
                songTitle = cursor.getString(1);
                songArtist = cursor.getString(2);
                songYear = cursor.getString(4);
                Log.i(TAG, String.valueOf(songTitle));
                cursor.moveToNext();
            }
            cursor.close();
            db.close();
        }
        mSongTitle.setText(songTitle);
        mSongArtist.setText(songArtist);
        mSongYear.setText(songYear);


    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }


}

下面是数据库助手类:

代码语言:javascript
复制
public class MyDatabase extends SQLiteAssetHelper {

    private static  final String TAG = "Variable for query is ";
    private static final String DATABASE_NAME = "mankiniDB.sqlite";
    private static final int DATABASE_VERSION = 1;






    public MyDatabase(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }


    SongActivity mSongActivity = new SongActivity();
    String mGenre = mSongActivity.getGenre();
    String mDecade = mSongActivity.getDecade();





    public Cursor kamikazeSelected() {
        SQLiteDatabase db = getReadableDatabase();

        Cursor cursor =db.rawQuery("SELECT * FROM songList ORDER BY random() limit 1", null);

        return cursor;
    }

    public Cursor genreSelected() {
        SQLiteDatabase db = getReadableDatabase();

        Cursor cursor =db.rawQuery("SELECT * FROM songList WHERE Genre = ? ORDER BY random() limit 1", new String[] {mGenre});

        return cursor;
    }

    public Cursor decadeSelected() {
        SQLiteDatabase db = getReadableDatabase();

        Cursor cursor =db.rawQuery("SELECT * FROM songList WHERE Decade = ? ORDER BY random() limit 1", new String[] {mDecade});
        return cursor;
    }

    public Cursor bothSelected() {

        SQLiteDatabase db = getReadableDatabase();

        Cursor cursor =db.rawQuery("SELECT * FROM songList WHERE Decade = ? AND Genre = ? ORDER BY random() limit 1", new String[] {mDecade, mGenre});

        return cursor;
    }

}

下面是LogCat错误堆栈跟踪:

代码语言:javascript
复制
03-19 21:35:54.256    1751-1751/tomschinler.thegreatman_kiniskamikazekaraoke I/SQLiteAssetHelper﹕ successfully opened database mankiniDB.sqlite
03-19 21:35:54.260    1751-1751/tomschinler.thegreatman_kiniskamikazekaraoke D/AndroidRuntime﹕ Shutting down VM
03-19 21:35:54.264    1751-1751/tomschinler.thegreatman_kiniskamikazekaraoke W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xa4b61648)
03-19 21:35:54.276    1751-1751/tomschinler.thegreatman_kiniskamikazekaraoke E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{tomschinler.thegreatman_kiniskamikazekaraoke/tomschinler.thegreatman_kiniskamikazekaraoke.SongActivity}: java.lang.IllegalArgumentException: the bind value at index 1 is null
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.IllegalArgumentException: the bind value at index 1 is null
            at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:164)
            at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200)
            at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
            at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
            at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253)
            at tomschinler.thegreatman_kiniskamikazekaraoke.MyDatabase.genreSelected(MyDatabase.java:50)
            at tomschinler.thegreatman_kiniskamikazekaraoke.SongActivity.onCreate(SongActivity.java:82)
            at android.app.Activity.performCreate(Activity.java:5133)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)

问题是,无论我做什么,或者在哪里设置变量,数据库助手类都会接收和空变量,从而产生一个空参数。我需要用户的输入,完成查询。但它总是空的。请帮我看看我错过了什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-20 13:55:03

您不应该自己创建一个Activity实例(new SongActivity()),这是行不通的。您需要与现有的Activity实例进行通信,例如将其传递给DB处理程序,尽管不建议这样做。最好的方法是只传递所需的数据,这样您的活动和DB处理程序就可以解耦。

例如:

代码语言:javascript
复制
public Cursor genreSelected(final String genre) {
    SQLiteDatabase db = getReadableDatabase();
    Cursor cursor =db.rawQuery("SELECT * FROM songList WHERE Genre = ? ORDER BY random() limit 1", new String[] {genre});
    return cursor;
}

考虑将查询字符串作为private static final在您的类上移动,这使得从几个部分访问它们和/或修改它们更容易。

而且,您对Cursor的处理也很奇怪。这是正确的方法:

代码语言:javascript
复制
    try {
        while (cursor.moveToNext()) {
            songTitle = cursor.getString(1);
            songArtist = cursor.getString(2);
            songYear = cursor.getString(4);
            Log.i(TAG, String.valueOf(songTitle));
        }
    } finally {
        cursor.close()
    }
票数 0
EN

Stack Overflow用户

发布于 2019-06-03 07:17:30

代码语言:javascript
复制
public class DBHelper extends SQLiteOpenHelper {

    private final static String DATABASE_NAME = "UserInfo.db";

    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

        String CREATE_TABLE =
                "CREATE TABLE " + UserProfile.Users.TABLE_NAME + " (" +
                        UserProfile.Users._ID + " INTEGER PRIMARY KEY," +
                        UserProfile.Users.COLUMN_USERNAME + " TEXT," +
                        UserProfile.Users.COLUMN_DOB + " TEXT," +
                        UserProfile.Users.COLUMN_GENDER + " TEXT," +
                        UserProfile.Users.COLUMN_PASSWORD + " TEXT )";

        sqLiteDatabase.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }

    public long addInfo(String username, String password){

        SQLiteDatabase sqLiteDatabase = getWritableDatabase();

        ContentValues contentValues = new ContentValues();
        contentValues.put(UserProfile.Users.COLUMN_USERNAME, username);
        contentValues.put(UserProfile.Users.COLUMN_PASSWORD, password);

        long rowId = sqLiteDatabase.insert(UserProfile.Users.TABLE_NAME, null, contentValues);

        return rowId;
    }

    public int updateInfo(String userId, String userName, String password, String dob, String gender){

        SQLiteDatabase sqLiteDatabase = getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(UserProfile.Users.COLUMN_USERNAME, userName);
        values.put(UserProfile.Users.COLUMN_PASSWORD, password);
        values.put(UserProfile.Users.COLUMN_GENDER, gender);
        values.put(UserProfile.Users.COLUMN_DOB, dob);

        String selection = UserProfile.Users._ID + " = ?";
        String args[] = {userId};

        int count = sqLiteDatabase.update(UserProfile.Users.TABLE_NAME, values, selection, args);

        return count;
    }

    public ArrayList readAllInfo(){

        SQLiteDatabase sqLiteDatabase = getReadableDatabase();

        String[] projection = {

                UserProfile.Users._ID,
                UserProfile.Users.COLUMN_USERNAME,
                UserProfile.Users.COLUMN_DOB,
                UserProfile.Users.COLUMN_GENDER,
                UserProfile.Users.COLUMN_PASSWORD
        };

        String sortOrder = UserProfile.Users._ID + " DESC";

        Cursor cursor = sqLiteDatabase.query(
                UserProfile.Users.TABLE_NAME,
                projection,
                null,
                null,
                null,
                null,
                sortOrder
        );

        ArrayList<User> list = new ArrayList<>();

        if (cursor.getCount() > 0){

            while(cursor.moveToNext()){

                User newUser = new User();

                int id = cursor.getInt(cursor.getColumnIndexOrThrow(UserProfile.Users._ID));
                String user = cursor.getString(cursor.getColumnIndexOrThrow(UserProfile.Users.COLUMN_USERNAME));
                String date = cursor.getString(cursor.getColumnIndexOrThrow(UserProfile.Users.COLUMN_DOB));
                String gen = cursor.getString(cursor.getColumnIndexOrThrow(UserProfile.Users.COLUMN_GENDER));
                String pass = cursor.getString(cursor.getColumnIndexOrThrow(UserProfile.Users.COLUMN_PASSWORD));

                newUser.setUserId(id+"");
                newUser.setUserName(user);
                newUser.setDateOfBirth(date);
                newUser.setGender(gen);
                newUser.setPassword(pass);

                list.add(newUser);
            }
        }

        return list;
    }

    public ArrayList readAllInfo(String userId, String userName){

        String selection;
        String[] args = {""};

        if(userId == null){

            selection = UserProfile.Users.COLUMN_USERNAME + " LIKE ?";
            args[0] = userName;
        }
        else
        {
            selection = UserProfile.Users._ID + " = ?";
            args[0] = userId;
        }

        SQLiteDatabase sqLiteDatabase = getReadableDatabase();

        String[] projection = {

                UserProfile.Users._ID,
                UserProfile.Users.COLUMN_USERNAME,
                UserProfile.Users.COLUMN_DOB,
                UserProfile.Users.COLUMN_GENDER,
                UserProfile.Users.COLUMN_PASSWORD
        };



        String sortOrder = UserProfile.Users._ID + " DESC";

        Cursor cursor = sqLiteDatabase.query(
                UserProfile.Users.TABLE_NAME,
                projection,
                selection,
                args,
                null,
                null,
                sortOrder
        );

        ArrayList<User> list = new ArrayList<>();

        if (cursor.getCount() > 0){

            while(cursor.moveToNext()){

                User newUser = new User();

                int id = cursor.getInt(cursor.getColumnIndexOrThrow(UserProfile.Users._ID));
                String user = cursor.getString(cursor.getColumnIndexOrThrow(UserProfile.Users.COLUMN_USERNAME));
                String date = cursor.getString(cursor.getColumnIndexOrThrow(UserProfile.Users.COLUMN_DOB));
                String gen = cursor.getString(cursor.getColumnIndexOrThrow(UserProfile.Users.COLUMN_GENDER));
                String pass = cursor.getString(cursor.getColumnIndexOrThrow(UserProfile.Users.COLUMN_PASSWORD));

                newUser.setUserId(id+"");
                newUser.setUserName(user);
                newUser.setDateOfBirth(date);
                newUser.setGender(gen);
                newUser.setPassword(pass);

                list.add(newUser);
            }
        }

        return list;
    }

    public int deleteInfo(String username){

        SQLiteDatabase sqLiteDatabase = getReadableDatabase();

        String selection = UserProfile.Users._ID + " = ?";
        String[] args = {username};

        int deletedRows = sqLiteDatabase.delete(UserProfile.Users.TABLE_NAME, selection, args);

        return deletedRows;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29167732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档