创建数据库时将数据添加到sqlite数据库

时间:2014-06-07 16:38:45

标签: java android sqlite

我是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例外

帮助我避免这种情况,并在数据库创建后立即插入数据。

2 个答案:

答案 0 :(得分:1)

不得onCreate回调中关闭数据库;呼叫者仍然有一个活动的交易。

只需对所有数据库操作使用db参数。

答案 1 :(得分:1)

在您的数据库助手onCreate()中,您无法呼叫getWritableDatabase()。而是将传入的db上的插入作为方法的参数执行。不要打电话给close()

修改数据库帮助程序onCreate()后,卸载您的应用程序,以便删除旧的数据库文件,并运行onCreate()中的代码。