我的Android应用程序中的数据库出了问题。也许,我的申请正在运作,但让我解释一下。
以下是我的应用程序代码的一部分..我不想粘贴整个它不需要。
private SQLiteStatement insertStmt;
private static final String INSERT = "insert into "
+ TABLE_NAME + "(name,surname) values (?,?)";
public DataHelper(Context context) {
this.context = context;
OpenHelper openHelper = new OpenHelper(this.context);
this.db = openHelper.getWritableDatabase();
this.insertStmt = this.db.compileStatement(INSERT);
}
public long insert(String name, String surname) {
this.insertStmt.bindString(1, name);
this.insertStmt.bindString(2, surname);
return this.insertStmt.executeInsert();
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME +
"(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, surname TEXT)");
}
因此,当我尝试运行我的应用程序时,我会强制关闭,但是当我手动放置时:
dh.insert("test", "ooo");
..在我的主要活动的onCreate方法中,一切都很好并且正常工作。 因此,结论是我必须首次运行应用程序以便它可以正常工作。我想可能用我之后通过应用程序中的一些TextView插入的新信息更新那一行,但我想知道是否有比这更聪明的解决方案?
答案 0 :(得分:1)
显然,您的插入没有错误,至少不会导致您的应用程序崩溃。
由于您收到了CursorIndexOutOfBoundsException,这意味着您在某个地方有一个select查询并尝试移动或设置它,然后再检查它是否有任何行。
如果您将光标移动到不存在的索引,通常会发生这种情况,即光标为空时cursor.moveToFirst()
或cursor.move(n)
n
大于cursor.getCount()-1
< / p>
在移动或访问游标之前,您总是必须检查是否有任何行返回!
Cursor c = db.query(...);
if(c!=null && c.getCount()>0) {
c.moveToFirst(); // (or c.move(0))
// Do your cursor operations here!
}
显然,您的插入因某些原因失败,您可以通过以下方式轻松检查:
long insertId = dh.insert("test", "ooo");
if(insertId > 0) {
// insert was successfull
} else {
// insert failed
}