【发布时间】:2015-03-16 19:47:32
【问题描述】:
数据库中有数据(准确地说是两行),每行都有信息。
这是来自 DBADAPTER 的代码(重要,不是全部):
// Field Names:
public static final String KEY_ROWID = "_id";
public static final String KEY_DEVICE = "device";
public static final String KEY_TYPE = "type";
public static final String KEY_DEVID = "devid";
public static final String[] ALL_KEYS = new String[] {KEY_ROWID, KEY_DEVICE, KEY_TYPE, KEY_DEVID};
public static final String[] DEVID_KEY = new String[] {KEY_DEVID};
// Column Numbers for each Field Name:
public static final int COL_ROWID = 0;
public static final int COL_DEVICE = 1;
public static final int COL_TYPE = 2;
public static final int COL_DEVID = 3;
// DataBase info:
public static final String DATABASE_NAME = "dbDevices";
public static final String DATABASE_TABLE = "mainDevices";
public static final int DATABASE_VERSION = 10; // The version number must be incremented each time a change to DB structure occurs.
//SQL statement to create database
private static final String DATABASE_CREATE_SQL =
"CREATE TABLE " + DATABASE_TABLE
+ " (" + KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ KEY_DEVICE + " TEXT NOT NULL, "
+ KEY_TYPE + " TEXT, "
+ KEY_DEVID + " TEXT NOT NULL "
+ ");";
private final Context context;
private DatabaseHelper myDBHelper;
private SQLiteDatabase db;
// Get a specific row (by devid)
public String getDevName(String devid) {
String name;
String where = KEY_DEVID + " like '%" + devid + "%'";
Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS,
where, null, null, null, null, null);
c.moveToFirst();
name = c.getString(COL_DEVICE);
return name;
}
这是调用它的代码:
String incomingMessage = " ";
incomingMessage = in.readLine() + System.getProperty("line.separator");
devName = devDB.getDevName(incomingMessage);
我知道这是获取信息,因为它会记录:03-16 15:39:47.072: V/String(18073): 5122
每当我运行它时,我都会收到错误:
03-16 15:39:47.122: W/System.err(18073): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
03-16 15:39:47.122: W/System.err(18073): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:426)
03-16 15:39:47.122: W/System.err(18073): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
03-16 15:39:47.132: W/System.err(18073): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
03-16 15:39:47.132: W/System.err(18073): at com.ti.cc3x.android.DBAdapter.getDevName(DBAdapter.java:121)
03-16 15:39:47.132: W/System.err(18073): at com.ti.cc3x.android.broadcastListener$1.run(broadcastListener.java:112)
03-16 15:39:47.132: W/System.err(18073): at java.lang.Thread.run(Thread.java:841)
我已尝试检查非空游标。所做的只是什么都不告诉我。我知道有数据我要求它查看我只是不知道为什么它不会显示它。谁能告诉我哪里出错了?谢谢!
【问题讨论】:
-
发布logcat时,为了便于阅读,请将其放在代码块中。任何类型的堆栈跟踪或其他冗长的错误消息通常也是如此。
-
另外,我强烈建议您在 Android 上为 SQLite 使用第三方库,除非您是熟练的 DBA 和/或有实际理由不使用库。 Android 的默认实现虽然功能强大,但非常繁琐且容易出现开发人员错误。我制作了一个小型的开源
DatabaseManager类,它简化了GitHub 上的线程和同步。但我真的建议使用 SugarORM、GreenDao 或 ActiveAndroid(还有其他)。 -
对于一个潜在的解决方案,您将
in.readLine() + "\r\n"(\r\n 是行分隔符)传递给getDevName,因此您的查询实际上是针对LIKE '%line_that_i_read\r\n%',所以您不是获取返回的任何行,因此索引 0 不可用。 -
这行得通。我删除了行分隔符并使用了 Daniel Nugent 提供的代码,它输出了我需要的内容!惊人的!谢谢!
标签: java android sqlite android-cursor