【问题标题】:ListView does not show items that are stored in an SQLite databaseListView 不显示存储在 SQLite 数据库中的项目
【发布时间】:2017-08-30 23:49:28
【问题描述】:

我刚刚为一个简单易用的持久性应用程序实现了一个 SQLite 数据库。但是,问题是当我重新启动应用程序时,我没有存储在 SQLite 数据库中的数据。以下是我的 SQLite 助手类:

public class DatabaseHelper extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "todo.db";
    public static final String TABLE_NAME = "student";
    public static final String ID = "id";
    public static final String TO_DO = "todo";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String CREATE_TO_DO_TABLE = "CREATE TABLE "
                + TABLE_NAME
                + "("
                + ID
                + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                + TO_DO
                + " TEXT"
                + ")";
        sqLiteDatabase.execSQL(CREATE_TO_DO_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(sqLiteDatabase);
    }

    public boolean insertData(String todo){
        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(TO_DO, todo);
        sqLiteDatabase.insert(TABLE_NAME, null, contentValues);

        return true;
    }
}

在我的 MainActivity.java 中,我将我的列表项以及 ListView 添加到数据库中。

public class MainActivity extends AppCompatActivity {
    DatabaseHelper databaseHelper;
    private final int REQUEST_CODE = 10;
    ArrayList <String> toDoItems = new ArrayList<>();
    ArrayAdapter<String> adapter;
    ListView listItems;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listItems = (ListView) findViewById(R.id.listViewItems);
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, toDoItems);
        listItems.setAdapter(adapter);
        databaseHelper = new DatabaseHelper(this);

        ...
    }

    public void addItem(View v){
        EditText newItem = (EditText) findViewById(R.id.itemInputEditText);
        String item = newItem.getText().toString();
        databaseHelper.insertData(item);
        adapter.add(item);
        newItem.setText("");
    }
}

我认为我需要在 onCreate 方法中做一些事情,但我的 addItem(View v) 方法是通过按钮 onClick 调用的。

【问题讨论】:

  • I do not have my data that is stored in an SQLite database - 您是否已将数据库文件从设备上拉出adb pull data/data/your.package.name/databases/your_database_name 以进行检查 - 注意将需要有根设备(又名 android 模拟器)来提取文件。还要检查insertDatainsert 的返回——无论如何你都在任意返回true
  • 我有一个G5,无法root。

标签: java android sqlite listview


【解决方案1】:

正如@cristian_franco 所说,toDoItems 是空的。您需要做的是在 DatabaseHelper 类中创建另一个方法,就像这样。

    public ArrayList<String> showStudents(){
    ArrayList<String> list = new ArrayList<String>();
    SQLiteDatabase db = this.getReadableDatabase();
    String query = "SELECT  * FROM " + TABLE_NAME;
    Cursor cursor = db.rawQuery(query, null);
    if (cursor.moveToFirst()) {
        do {
            list.add(cursor.getString(0)+"  "+cursor.getString(1));
        } while (cursor.moveToNext());
    }

    cursor.close();
    db.close();
    return list;
}

然后像这样分配toDoItems

databaseHelper = new DatabaseHelper(this);    
toDoItems=databaseHelper.showStudents();

如果我的代码有任何错误,请告诉我。

【讨论】:

  • 我只是注意到我没有投票给你,所以我继续投票。如果您认为这是一个很好的问题,您能否也给我一个赞成票?
【解决方案2】:

实现此函数以获取值,

public  void getDatos(){
        SQLiteDatabase database = databaseHelper.getWritableDatabase();
        Cursor  cursor = database.rawQuery("select * from student",null);
        if (cursor.moveToFirst()) {
            while (!cursor.isAfterLast()) {
                String name = cursor.getString(cursor.getColumnIndex("todo"));

                Toast.makeText(getApplicationContext(), name, Toast.LENGTH_LONG).show();
                cursor.moveToNext();
            }
        }
    }

你的保存功能是正确的,只有你需要获取信息

【讨论】:

  • 我不知道你为什么被否决。这行得通!我给了你一个赞成票。如果您认为我的问题问得很好,您也可以给我点个赞吗?
猜你喜欢
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多