我正在尝试将数据库添加到我的应用中。 但是我无法运行它而没有错误。 我跟着这个article 这是我的代码。
首先我有设置类
public class Settings {
int _id;
int _update_interval;
public Settings(){
}
public Settings(int id,int update_interval){
this._id = id;
this._update_interval = update_interval;
}
public Settings(int update_interval){
this._update_interval = update_interval;
}
public int getID(){
return this._id;
}
public void setID(int id){
this._id = id;
}
public Integer getUpdateInterval(){
return this._update_interval;
}
public void setUpdateInterval(int update_interval){
this._update_interval = update_interval;
}
之后是Handler
public class DatabaseHandler extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "app_data";
private static final String TABLE_SETTINGS = "settings";
private static final String KEY_ID = "id";
private static final String KEY_UPDATE_INTERVAL = "update_interval";
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_SETTINGS_TABLE = "CREATE TABLE " + TABLE_SETTINGS + "("
+ KEY_ID + " INTEGER PRIMARY KEY," + KEY_UPDATE_INTERVAL + " INTEGER " + ")";
db.execSQL(CREATE_SETTINGS_TABLE);
ContentValues values = new ContentValues();
values.put(KEY_ID, 1);
values.put(KEY_UPDATE_INTERVAL, 60);
db.insert(TABLE_SETTINGS, null, values);
db.close();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_SETTINGS);
onCreate(db);
}
Settings getSettings(int id) {
SQLiteDatabase dbа = this.getReadableDatabase();
Cursor cursor = dbа.query(TABLE_SETTINGS, new String[] { KEY_ID,
KEY_UPDATE_INTERVAL }, KEY_ID + "=?",
new String[] { String.valueOf(id) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
Settings settings = new Settings(cursor.getInt(0),cursor.getInt(1));
return settings;
}
void addSettings(Settings settings) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_ID, settings.getID());
values.put(KEY_UPDATE_INTERVAL, settings.getUpdateInterval());
db.insert(TABLE_SETTINGS, null, values);
db.close();
}
我正在使用它
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DatabaseHandler db = new DatabaseHandler(this);
Settings settings = db.getSettings(1);
}
}
然而,每次当我尝试使用处理程序中的函数时,我都会在SQLiteDatabase db = this.getWritableDatabase()之后收到错误; 错误本身是:尝试重新打开已经关闭的对象:SQLiteDatabase: 这告诉我对象已关闭,但我只是再次创建它? 我的代码与教程完全相同.. 如果它确实很重要,我会使用android studio。
答案 0 :(得分:3)
删除db.close()
中的onCreate()
。您不拥有作为参数传递的数据库,您不应该关闭它。
答案 1 :(得分:0)
您需要删除对db.close()
(onCreate()
)
SQLiteOpenHelper
拥有数据库对象,当Android关闭Helper时,它将为您关闭数据库,就像它为您打开数据库一样。
此外,你不应该在主线程中调用从数据库中获取内容(即getSettings()
中的onCreate()
),因为它使用getReadableDatabase()
或{{1这些可能需要很长时间才能返回并导致ANR。
Android docs on getReabableDatabase()