1

我正在使用游标访问我的应用程序中的 sqlite 数据库。

我在我的数据库上使用 .getInt() 时遇到问题。我的数据库是预先创建的,并且我有一些游标可以执行查询以与信息交互。其中一个表中的几个列设置为 INTEGER 类型。我意识到 sqlite 没有内置检查来确保列确实是 INT。但是,在检索数据时,我可以毫无问题地使用 .getString() 函数,但调用 .getInt() 会导致应用程序崩溃。下面是相关代码。如果我遗漏了什么,请告诉我,我会补充的。

任何帮助是极大的赞赏。非常感谢。

光标:

public Cursor getSkitStats(int module, int skit) {
    Cursor mCursor = myDataBase.rawQuery("SELECT * FROM score WHERE mod="+module+" AND skit="+skit+"", null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}

我正在使用一个简单的 Toast 调用来输出查询结果:

Toast.makeText(getApplicationContext(), scoreContent.getInt(0), Toast.LENGTH_SHORT).show();

变量 scoreContent 是光标。

这是崩溃输出:

07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.app.ActivityThread.access$1500(ActivityThread.java:121)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.os.Looper.loop(Looper.java:130)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.app.ActivityThread.main(ActivityThread.java:3701)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at java.lang.reflect.Method.invokeNative(Native Method)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at java.lang.reflect.Method.invoke(Method.java:507)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at dalvik.system.NativeStart.main(Native Method)
07-08 23:53:31.726: E/AndroidRuntime(15685): Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.content.res.Resources.getText(Resources.java:205)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.widget.Toast.makeText(Toast.java:258)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at jp.atomicideas.ne.Summary.onCreate(Summary.java:90)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623)
07-08 23:53:31.726: E/AndroidRuntime(15685):    ... 11 more
4

4 回答 4

2

如果您发送一个 int 到Toast.makeText,它假定它是一个资源 id。看这里:

http://developer.android.com/reference/android/widget/Toast.html#makeText(android.content.Context , int, int)

如果您只想打印一个数字,请使用toString()将其转换为字符串。(或 Integer.toString() 等)

于 2012-07-08T15:23:52.737 回答
1
  1. “我可以毫无问题地使用 .getString() 函数。”

    它是一个方法,而不是一个函数。:)

  2. 尽量避免使用rawQuery... 它不能防止 SQL 注入,并且根据我的经验不太可靠(这种情况很少见,但是当您尝试这样做时,某些设备会表现出奇怪的行为和奇怪的错误)。

    您应该改用这些SQLiteDatabase.query()方法。例如,

    String table = "score";
    String[] proj = null;
    String selection = "mod=? AND skit=?";
    String[] selectionArgs = new String { "module", "skit" };
    
    myDatabase.query(table, proj, selection, selectionArgs, null);
    
  3. 你用scoreContent.getInt(0)

    即使整数列索引是预先创建的,也不应该对其进行硬编码。用于在运行时Cursor.getColumnIndex(column_name)检索索引值。

  4. 你用Toast.makeText(context, scoreContent.getInt(0), Toast.LENGTH_SHORT).show();

    尝试将第二个参数转换为String... 之类的

    ""+scoreContent.getInt(cursor.getColumnIndex(col_name))
    
于 2012-07-08T15:26:38.177 回答
0

scoreContent.getInt(0) 它工作正常并返回一个ineteger,我假设在0索引处光标包含ineter类型值。

由于 scoreContent.getInt(0) 返回 ineteger 并且您使用该值作为 Toast 的 第二个参数,但Toast 在这里需要 String

于 2012-07-08T15:34:14.590 回答
0

您应该存储所有列的名称,并使用getColumnIndex()检索索引。然后使用索引获取数据。一旦知道了列的格式,就知道应该使用哪种方法。

已编辑

您对 toast 的调用会为其提供数据库中的数字。第二个参数需要字符串资源的 ID 或字符串。数据库中的值显然是不正确的。

于 2012-07-08T15:30:49.993 回答