1

我正在尝试从 SQLite 数据库填充列表视图我可以创建数据库并向其中添加项目并将它们显示在 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只有一个项目的,即 的值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);
}

因为目前您没有检查 的返回值moveToFirst,并且它可能返回 false (意味着没有行),但是您的 do-while 循环意味着游标将至少被读取一次,无论它是否有 0 行,并且如果有 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 回答