在 SQLite 数据库中插入或读取值不会产生任何结果

Inserting or Reading values in an SQLite database doesn't yield any results

今天晚上 Android 开始使用 SQLite。练习了 Google 文档中的所有代码,但它仍然出错,我不知道我哪里出错了。看看能不能查到具体情况

DatabaseHelperContract.java

package com.practice.sqlitepractice;

import android.provider.BaseColumns;

//final class to prevent inheritance
public final class DatabaseHelperContract {

    //Create Entry String
    public static final String CREATE_ENTRY = "CREATE TABLE " + DatabaseSchema.TABLE_NAME + " (" +
            DatabaseSchema._ID + " INTEGER PRIMARY KEY, " + DatabaseSchema.COLUMN_NAME + " TEXT)";

    //private constructor to prevent accidental instantiation
    private DatabaseHelperContract(){
    }

    /*Inner class that defines individual table contents*/
    public static class DatabaseSchema implements BaseColumns{
        public static final String TABLE_NAME = "details";
        public static final String COLUMN_NAME = "name";
    }
}

DatabaseHelper.class

package com.practice.sqlitepractice;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

class DatabaseHelper extends SQLiteOpenHelper {

    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "table.db";

    public DatabaseHelper(@Nullable Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(DatabaseHelperContract.CREATE_ENTRY);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

MainActivity.java

package com.practice.sqlitepractice;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText nameEditText;
    private Button insertButton;
    private Button readButton;
    private ListView detailsListView;

    private DatabaseHelper databaseHelper;

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

    @Override
    protected void onDestroy() {
        super.onDestroy();
        databaseHelper.close();
    }

    private void insertionMethod(String name) {
        //gets the data repository in write mode
        SQLiteDatabase sqLiteDatabase = databaseHelper.getWritableDatabase();

        //create a new map of values, where the columns are the keys
        ContentValues contentValues = new ContentValues();
        contentValues.put(DatabaseHelperContract.DatabaseSchema.COLUMN_NAME, name);

        try {
            long newRowID = sqLiteDatabase.insert(DatabaseHelperContract.DatabaseSchema.TABLE_NAME, null, contentValues);
            Toast.makeText(this, "ID for newly created row: " + newRowID, Toast.LENGTH_SHORT).show();
        } catch (SQLException exception) {
            exception.printStackTrace();
        }
    }

    private void readMethod() {
        SQLiteDatabase sqLiteDatabase = databaseHelper.getReadableDatabase();
        String[] projection = {DatabaseHelperContract.DatabaseSchema.COLUMN_NAME};

        try {
            Cursor cursor = sqLiteDatabase.query(
                    DatabaseHelperContract.DatabaseSchema.TABLE_NAME,
                    projection,
                    null,
                    null,
                    null,
                    null,
                    null);

            List<String> itemIDs = new ArrayList<>();
            while (cursor.moveToNext()) {
                String name = cursor.getString(cursor.getColumnIndex(DatabaseHelperContract.DatabaseSchema.COLUMN_NAME));
                itemIDs.add(name);
            }

            cursor.close();
            displayMethod(itemIDs);
        } catch (SQLiteException exception) {
            exception.printStackTrace();
        }
    }

    private void displayMethod(List<String> list) {
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, R.id.details_list_view, list);
        detailsListView.setAdapter(arrayAdapter);
    }

    @Override
    public void onClick(View view) {
        if (view == readButton) {
            readMethod();
        }

        if (view == insertButton) {
            String name = nameEditText.getText().toString();
            insertionMethod(name);
        }
    }

    private void initializeWidgetsMethod() {
        nameEditText = findViewById(R.id.name_edit_text);
        insertButton = findViewById(R.id.insert_button);
        readButton = findViewById(R.id.read_button);
        detailsListView = findViewById(R.id.details_list_view);
        databaseHelper = new DatabaseHelper(getApplicationContext());
    }
}

注意:我知道数据库事务很昂贵,应该始终异步执行。此代码仅供练习,我将在稍后阶段执行所有这些代码。

您的代码的问题在于您在 displayMethod() 中初始化 ArrayAdapter 的方式。
此定义的 3d 参数:

ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(
   this, 
   android.R.layout.simple_list_item_1, 
   R.id.details_list_view, 
   list
);

R.id.details_list_view,它是 ListView 资源 ID,虽然您应该使用 TextView 资源 ID,但前提是您创建了一个资源 ID 以在 ListView 中使用。
这样的TextView是你创造的吗?
如果没有,那么您可以通过不传递此参数来使用默认值 TextView
所以把代码改成这样:

ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(
    this, 
    android.R.layout.simple_list_item_1, 
    list
);