【问题标题】:rawQuery not working in SQLite androidrawQuery 在 SQLite android 中不起作用
【发布时间】:2012-09-04 19:19:06
【问题描述】:

我要做的就是设置一个等于我数据库中的条目之一的字符串。我正在访问的表有 1 列(除了 ID 列)。我已经为此苦苦挣扎了一段时间,因此即使提出了类似的问题,我也无法使这种情况发挥作用。我对 SQLite 中的其他一些命令感到满意,但仍然是初学者。这就是我所拥有的。我很确定一旦这种方法有效,我从另一个类的调用就会正常工作。

请注意,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)

我将解释问题所在,而不是删除这个问题(因为挖掘 cmets 会很烦人):

  1. 我不能像以前那样只为 SQLite 条目分配一个类字符串。相反,我必须先打开数据库才能读取它:由于我需要先打开数据库才能读取它,因此我需要创建 SQLite 数据库类的实例。
  2. 因为我使用的是游标,所以我需要使用 moveToFirst 方法才能正常工作。

感谢今天帮助过我的所有人,如果这些结论不正确,请告诉我,因为我不想将误解传播给像我一样困惑的人。 亚当

【问题讨论】:

  • 将光标对象转换为字符串有什么具体原因吗?注释行必须有效。
  • 我使用一个字符串变量来膨胀到我已经构建的一些视图中。我认为如果我不这样做,我必须更改很多我已经制作的代码。是不是不能把这个对象转成字符串?

标签: android sqlite


【解决方案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;
         }


        }

【讨论】:

  • rawQuery() 将始终返回一个光标,因此 mycursor 不会是 null。然而mycursor 可能是empty,在尝试从Cursor 访问任何“get”方法之前,您应该使用moveToFirst()moveToNext()getCount() 等进行检查。跨度>
  • 是的,你是对的。感谢您指出了这一点。我将编辑答案。
  • 这仍然有效。我注意到一个空指针异常(我对调试很陌生)。关于我如何确切地找到正在发生的事情的任何建议?数据库创建得很完美,只是这种方法行不通
  • 但是从你所说的myDatabase 必须是null。你在哪里初始化这个?看来你从来没有打电话给myDatabase = ...
  • @adamkim 光标可能会返回第 50 个条目,但 光标的索引-1 开始,第 50 个条目存储在 索引 0。所以我们调用moveToNext() 来移动光标的索引而不是行ID 本身。 (我没有意识到我们在评论 VendettaDroid 的回答。)哦,好吧,其他人因我的工作而受到称赞......
【解决方案2】:

看起来您只是忘记将光标移动到第一个结果。试试这个:

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 "";
}

【讨论】:

  • 所以它仍然崩溃。关于为什么会发生这种情况的任何想法?如果我不调用此方法,则可以正常工作。如果我调用此方法甚至在应用程序中的任何位置定义任何字符串,它都会崩溃。
  • 嗯,将 logcat 错误剪切并粘贴到您的问题中,这样我就可以看到发生了什么。
  • 我发布了它们。添加一些断点后,我得到“找不到源”。如果我在这行代码之后立即中断: Cursor mycursor = myDatabase.rawQuery("SELECT " + COLUMN_CATEGORIES + " FROM "+ StringCategory_Table +" WHERE " + _ID + " = " + catId, null);
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 我在课堂上早先将 COLUMN_CATEGORIES 定义为字符串;很抱歉没有把它放在问题中(现在就这样做)。感谢您提供有关已注释掉的行的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    相关资源
    最近更新 更多