我遵循了如何使用android SDK处理SQLite数据库的教程。我的问题是当我调用方法“getUsername()”时应用程序崩溃。我做错了什么?
package racenet.racenet;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class Preferences extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 2;
private static final String DATABASE_NAME = "racenet.racenet.db";
Preferences(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE settings(key TEXT, value TEXT)");
values = new ContentValues();
values.put("user_name", "");
getWritableDatabase().insert("settings", null, values);
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
}
public String getUsername() {
Cursor c = getReadableDatabase().query("settings", new String[]{"value"},
"key = 'user_name'", null, null, null, null);
c.moveToFirst();
String username = c.getString(0);
c.close();
return username;
}
}
答案 0 :(得分:3)
嗨,试试这个:
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE settings (key TEXT, value TEXT);");
values = new ContentValues();
// First argument of the put method is a column name
// Second argument is an inserted value
values.put("key", "user_name");
values.put("value", "user_value");
db.insert("settings", null, values);
}
// This method will drop your table and create a new one if you have changed
// the database version
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS settings");
onCreate(db);
}
答案 1 :(得分:1)
确保崩溃应用程序的一件事是您不关闭在方法中使用的数据库对象。你需要像这样重写它:
public String getUsername() {
SQLiteDatabase database = getReadableDatabase();
Cursor c = getReadableDatabase().query("settings", new String[]{"value"},
"key = 'user_name'", null, null, null, null);
c.moveToFirst();
String username = c.getString(0);
c.close();
database.close();
return username;
}
编辑使用@slukian观察结果扩展我的答案更加完整:您不应该从getWritableDatabase()
或{{getReadableDatabase()
内拨打onCreate
或onUpgrade
1}}方法。实际上你甚至不需要。将此方法重写为:
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE settings(key TEXT, value TEXT)");
values = new ContentValues();
values.put("user_name", "");
db.insert("settings", null, values);
}
请注意,我只是使用传入的db
对象,就像你上面的几行一样。
答案 2 :(得分:0)
你因为写了
而收到错误c.moveToFirst();
不检查c
是否有行..
反正.. c没有行导致你没有正确添加行..
只需正确添加值,如“Taras Feschuk”的回答中提到的那样。
每当你写c.moveToFirst()
时..先查看if(c.getCount()>0)