0

我在一个活动中有一个数据库,我想在另一个活动中打开,在这个活动中我也希望创建一个列表视图:

我的代码如下

messagedb=context.openOrCreateDatabase("message",0, null);
                    messagedb.execSQL(
                            "CREATE TABLE IF NOT EXISTS tab( " +
            " _id INTEGER PRIMARY KEY AUTOINCREMENT ," +
            " nickname varchar,sender INT(13),body varchar)");


                    messagedb.execSQL("INSERT INTO tab VALUES('"+nickname+"','"+sender+"','"+sb+"')");
                    messagedb.close();
                    mydb.close();

当我插入值时,它说您的数据库有 4 列,但您输入了 3 列值......我怎样才能从表中自动添加 _id......

我的 listView 活动如下

public class ListView extends ListActivity {

SQLiteDatabase messagedb;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_list);



    messagedb=ListView.this.openOrCreateDatabase("message",0, null);
    messagedb.execSQL(
            "CREATE TABLE IF NOT EXISTS tab(" +
            " _id INTEGER PRIMARY KEY AUTOINCREMENT," +
            " nickname varchar,sender INT(13),body varchar)");



    Cursor cur = messagedb.rawQuery("select _id, nickname, body from tab", null);
    String[] from = new String[] { "nickname", "body" };
    int[] to = new int[] { R.id.sender_entry, R.id.body_entry};

    SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.my_list_entry, cur, from, to);

    this.setListAdapter(mAdapter);

    cur.close();

    messagedb.close();


}

protected void onListItemClick(android.widget.ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);

    String nickName = ((TextView) v.findViewById(R.id.sender_entry)).getText().toString();

    String body = ((TextView) v.findViewById(R.id.body_entry)).getText().toString();

    Intent intent = new Intent(ListView.this,MessageViewPage.class);
    Bundle b = new Bundle();

    b.putString("nick", nickName);
    b.putString("body", body);

    intent.putExtras(b);

    startActivity(intent);

    finish();





}

}
4

2 回答 2

0

这个:

" _id INTEGER PRIMARY KEY ,"

如果您希望数据库自动为您处理主键,则应该是这样:

" _id INTEGER PRIMARY KEY AUTOINCREMENT,"

否则,您需要在插入时手动添加“_id”。

使用autoincrement是迄今为止更容易的解决方案。

然后,如果您想要记录中的所有数据,只需执行以下操作:

Cursor cur = messagedb.rawQuery("select * from tab", null); 

如果您只想要特定的位,只需调用它们(但请记住,在使用大多数 Android 小部件时,您必须_id光标中,即使您不显示它)。因此,如果您只想要昵称,您的查询可能如下所示:

Cursor cur = messagedb.rawQuery("select _id, nickname from tab", null); 

您还应该只有在一个地方创建表的代码。把它放在两个地方是很糟糕的。看起来现在发生的事情是您更改了一个但没有更改另一个,并且您未更改的那个首先被调用,在没有更改的情况下创建表,然后当第二个被调用时,表 alre4ady 存在所以它不不要做出改变。至少您需要将两个表创建语句更改为相同。更好的解决方案是摆脱其中之一。

您还应该使用 ContentValues 进行插入...

ContentValues initialValues = new ContentValues();
initialValues.put("nickname", nickname);
initialValues.put("sender", sender);
initialValues.put("body", sb);
messagedb.insertWithOnConflict(tab, null, initialValues, SQLiteDatabase.CONFLICT_IGNORE);

哦,如果您在列表仍处于活动状态时关闭光标,您将遇到问题。摆脱cur.close()呼叫,而是startManagingCursor(cur);在获得光标后一切正常。这样系统将为您管理光标。

于 2012-07-06T15:11:29.903 回答
0

尝试将您的 ID 设置为自动增量:
ID 整数主键自动增量
我还建议使用 ContentValues 使用方法 sqlDB.insert(table, nullColumnHack, values) 将值插入 DB。它更容易,更不容易出错。

于 2012-07-06T15:14:29.783 回答