1

SQLite db からリスト ビューを生成しようとしています。db を作成して項目を追加し、それらを TextView に表示できますが、何らかの理由で ListView には表示されません。

sData が間違ったタイプのオブジェクトであるということですか?

誰でも助けてもらえますか?

public void DBTest() {

        SQLiteDatabase myDB = null;
        String TableName = "myTable";

        /* Create a Database. */
        try {
            myDB = this.openOrCreateDatabase(DATABASE_NAME, MODE_PRIVATE, null);

            /* Create a Table in the Database. */
            myDB.execSQL("CREATE TABLE IF NOT EXISTS "
                    + TableName
                    + " (_id integer primary key autoincrement, name text, script text, su short);");

            /* Insert data to a Table*/
            myDB.execSQL("INSERT INTO "
                    + TableName
                    + " (name, script, su)"
                    + " VALUES ('hello', 'reboot', 1);");

            /*retrieve data from database */
            Cursor c = myDB.rawQuery("SELECT * FROM " + TableName, null);

            int Column1 = c.getColumnIndex("name");
            int Column2 = c.getColumnIndex("script");
            int Column3 = c.getColumnIndex("su");

            // Check if our result was valid.
            c.moveToFirst();
            String sData="";
            if (c != null) {
                // Loop through all Results
                do {
                    String Name = c.getString(Column1);
                    String Script = c.getString(Column2);
                    int su = c.getInt(Column3);
                    sData = sData + Name + " " + Script + " " + su + "\n";
                } while (c.moveToNext());
            }

            ListView lv = (ListView) findViewById(R.id.mainListView);
            lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice, sData));

        } catch (Exception e) {
            Log.e("Error", "Error", e);
        } finally {
            if (myDB != null)
                myDB.close();
        }
    }
4

3 に答える 3

4

ListViewの値である 1 つの項目だけを持つ になりますsData。次のようなリストを作成する必要があります。

c.moveToFirst();
ArrayList<String> sData = new ArrayList<String>();
if (c != null) {
    do {
        String Name = c.getString(Column1);
        String Script = c.getString(Column2);
        int su = c.getInt(Column3);
        sData.add(Name + " " + Script + " " + su);
    } while (c.moveToNext());
}

ListView lv = (ListView) findViewById(R.id.mainListView);
lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice, sData));

また、カーソルのループを次のように変更することをお勧めします。

// cursor left as it came from the database because it starts at the row before the first row
ArrayList<String> sData = new ArrayList<String>();
while (c.moveToNext()) {
    String Name = c.getString(Column1);
    String Script = c.getString(Column2);
    int su = c.getInt(Column3);
    sData.add(Name + " " + Script + " " + su);
}

現時点では の戻り値をチェックしておらず、moveToFirstfalse (行がないことを意味する) を返す可能性があるため、do-while ループは、行が 0 であるかどうかにかかわらず、カーソルが少なくとも 1 回読み取られることを意味します。行が 0 の場合、アプリはクラッシュします。

于 2013-01-06T19:03:54.773 に答える
1
String sData="";

sData文字列配列を作成してみてください。それをアダプターに供給します。

于 2013-01-06T19:03:06.137 に答える
1

sData は配列ではありません

ArrayList<String> sData = new ArrayList<String>();
            if (c != null) {
                // Loop through all Results
                do {
                    String Name = c.getString(Column1);
                    String Script = c.getString(Column2);
                    int su = c.getInt(Column3);
                    String newData = Name + " " + Script + " " + su;
                    sData.add(newData);
                } while (c.moveToNext());
            }
于 2013-01-06T19:06:12.440 に答える