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 ,"

DBに主キーを自動的に処理させたい場合は、次のようにする必要があります。

" _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); 

また、テーブルを1か所に作成するためのコードのみが必要です。2か所に置くのは悪いことです。現在起こっていることは、一方を変更したが他方は変更していないようです。変更しなかった方が最初に呼び出され、変更なしでテーブルが作成され、2番目が呼び出されたときに、テーブルalre4adyが存在するため、変更されません。変更を加えないでください。少なくとも、両方のテーブル作成ステートメントを同じになるように変更する必要があります。より良い解決策は、それらの1つを取り除くことです。

また、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をautoincrementに設定してみてください
。IDintegerprimarykey autoincrementまた、ContentValuesを使用して、メソッドsqlDB.insert(table、nullColumnHack、values)を使用してDBに値を挿入することをお勧めします。簡単でエラーが発生しにくくなります。

于 2012-07-06T15:14:29.783 に答える