我是sqlite
数据库的新手,在我的项目中,我需要在创建数据库后立即添加数据。我试过这种方式,这是我的代码。
公共类MainActivity扩展了Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView v = (TextView)findViewById(R.id.textView1);
MySqlHelper helper = new MySqlHelper(this);
v.setText(helper.getBird(2));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
我创建了另一个类来打开sqlite数据库。
public class MySqlHelper扩展了SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "BirdDB";
private static final String TABLE_BIRDS = "birds";
private static final String KEY_ID = "id";
private static final String KEY_NAME = "name";
private static final String[] COLUMNS = {KEY_ID,KEY_NAME};
public MySqlHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String CREATE_TABLE = "CREATE TABLE birds ( " +
"id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"name TEXT )";
db.execSQL(CREATE_TABLE);
db.close();
SQLiteDatabase dbase = this.getWritableDatabase();
dbase.insert(TABLE_BIRDS, null, addBirdData("Sri Lanka Jungle Flowl"));
dbase.insert(TABLE_BIRDS, null, addBirdData("Red Faced Mal Koha"));
dbase.close();
}
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS birds");
this.onCreate(db);
}
public ContentValues addBirdData(String birdName){
ContentValues values = new ContentValues();
values.put(KEY_NAME, birdName);
return values;
}
public String getBird(int id){
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor =
db.query(TABLE_BIRDS, // a. table
COLUMNS, // b. column names
" id = ?", // c. selections
new String[] { String.valueOf(id) }, // d. selections args
null, // e. group by
null, // f. having
null, // g. order by
null); // h. limit
if (cursor != null)
cursor.moveToFirst();
String name = cursor.getString(1);
db.close();
return name;
}
它给了我java.lang.IllegalStateException: (conn# 0) already closed
例外
帮助我避免这种情况,并在数据库创建后立即插入数据。
答案 0 :(得分:1)
你不得从onCreate
回调中关闭数据库;呼叫者仍然有一个活动的交易。
只需对所有数据库操作使用db
参数。
答案 1 :(得分:1)
在您的数据库助手onCreate()
中,您无法呼叫getWritableDatabase()
。而是将传入的db
上的插入作为方法的参数执行。不要打电话给close()
。
修改数据库帮助程序onCreate()
后,卸载您的应用程序,以便删除旧的数据库文件,并运行onCreate()
中的代码。