rawQuery在SQLite android中不起作用

时间:2012-09-04 19:19:06

标签: android sqlite

我想要做的就是设置一个字符串,该字符串等于我的数据库中的一个条目。我正在访问的表有1列(除了ID列)。我一直在努力解决这个问题,即使提出了类似的问题,我也无法使这种情况发挥作用。我对SQLite中的其他命令很满意,但仍然是初学者。这就是我所拥有的。我很确定一旦这个方法起作用,我从anther类调用就可以了。

请注意,StringCategory_Table和COLUMN_CATEGORIES都定义为字符串。

我的数据库是使用以下内容创建的(除了以下方法之外,它适用于其他所有内容):

db.execSQL("CREATE TABLE " + StringCategory_Table + " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_CATEGORIES + " TEXT NOT NULL);");

这里是有问题的方法(使用SQLite open helper在数据库类中创建):

public String getCategory(int catId){
Cursor mycursor = myDatabase.rawQuery("SELECT " + COLUMN_CATEGORIES  + " FROM "+ StringCategory_Table +" WHERE " + _ID + " = " + catId, null);

//i no longer use this line:String strCatName = mycursor.toString();


String strCatName = mycursor.getString(mycursor.getColumnIndex(COLUMN_CATEGORIES));

        return strCatName;
    }

这是我上面代码的logcat:

09-04 20:05:47.764: E/AndroidRuntime(9232): FATAL EXCEPTION: main
09-04 20:05:47.764: E/AndroidRuntime(9232): java.lang.RuntimeException: Unable to instantiate activity  ComponentInfo{com.mypackage.namespace/com.mypackage.namespace.MyCurrentRestaurants}: java.lang.NullPointerException
09-04 20:05:47.764: E/AndroidRuntime(9232):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1880)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at android.os.Looper.loop(Looper.java:137)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at android.app.ActivityThread.main(ActivityThread.java:4424)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at java.lang.reflect.Method.invokeNative(Native Method)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at java.lang.reflect.Method.invoke(Method.java:511)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)

我不会删除这个问题,而是解释问题是什么(因为挖掘评论会很烦人):

  1. 我不能像往常一样将类字符串分配给SQLite条目。相反,我必须打开数据库才能读取它:因为我需要先打开数据库才能读取它,因此我需要创建一个SQLite数据库类的实例。
  2. 由于我正在使用游标,我需要先使用moveToFirst方法,然后才能运行。
  3. 感谢今天帮助过我的每一个人,如果这些结论不正确,请告诉我,因为我不想把误解传播给像我一样困惑的人。 亚当

4 个答案:

答案 0 :(得分:1)

看起来你只是忘了将Cursor移动到第一个结果。试试这个:

public String getCategory(int catId){
    Cursor mycursor = myDatabase.rawQuery("SELECT " + COLUMN_CATEGORIES  + " FROM " + StringCategory_Table +" WHERE " + _ID + " = " + catId, null);

    // Check if the row exists, return it if it does
    if(mycursor.moveToFirst())
        return mycursor.getString(mycursor.getColumnIndex(COLUMN_CATEGORIES));

    // No rows match id
    return "";
}

答案 1 :(得分:1)

试试这个,

public String getCategory(int catId){
        Cursor mycursor = myDatabase.rawQuery("SELECT " + COLUMN_CATEGORIES  + " FROM "+ StringCategory_Table +" WHERE " + _ID + " = " + catId, null);
      if(mycursor.moveToFirst()){ //Edited based on suggestion from SAM
          String strCatName = mycursor.getString(mycursor.getColumnIndex(COLUMN_CATEGORIES));
                  return strCatName;
        } else {
        return null;
         }


        }

答案 2 :(得分:0)

尝试使用链接http://codinglookseasy.blogspot.in/2012/08/sqlite-database.html

中的示例

而不是将光标对象转换为字符串尝试获取字段并将其存储在字符串

答案 3 :(得分:0)

看起来你的select语句可能有误。您应该传递列名字符串而不是“COLUMN_CATEGORIES”,它看起来像一个整数。之后,您应该使用注释掉的方式来访问字符串。