在SQLite数据库中插入或读取值没有产生任何结果。

huangapple go评论100阅读模式
英文:

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

问题

DatabaseHelperContract.java

  1. package com.practice.sqlitepractice;
  2. import android.provider.BaseColumns;
  3. // 防止继承的最终类
  4. public final class DatabaseHelperContract {
  5. // 创建 Entry 字符串
  6. public static final String CREATE_ENTRY = "CREATE TABLE " + DatabaseSchema.TABLE_NAME + " (" +
  7. DatabaseSchema._ID + " INTEGER PRIMARY KEY, " + DatabaseSchema.COLUMN_NAME + " TEXT)";
  8. // 防止意外实例化的私有构造函数
  9. private DatabaseHelperContract(){
  10. }
  11. /* 定义单个表内容的内部类 */
  12. public static class DatabaseSchema implements BaseColumns{
  13. public static final String TABLE_NAME = "details";
  14. public static final String COLUMN_NAME = "name";
  15. }
  16. }

DatabaseHelper.class

  1. package com.practice.sqlitepractice;
  2. import android.content.Context;
  3. import android.database.sqlite.SQLiteDatabase;
  4. import android.database.sqlite.SQLiteOpenHelper;
  5. import androidx.annotation.Nullable;
  6. class DatabaseHelper extends SQLiteOpenHelper {
  7. public static final int DATABASE_VERSION = 1;
  8. public static final String DATABASE_NAME = "table.db";
  9. public DatabaseHelper(@Nullable Context context) {
  10. super(context, DATABASE_NAME, null, DATABASE_VERSION);
  11. }
  12. @Override
  13. public void onCreate(SQLiteDatabase sqLiteDatabase) {
  14. sqLiteDatabase.execSQL(DatabaseHelperContract.CREATE_ENTRY);
  15. }
  16. @Override
  17. public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
  18. }
  19. }

MainActivity.java

  1. package com.practice.sqlitepractice;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.content.ContentValues;
  4. import android.database.Cursor;
  5. import android.database.SQLException;
  6. import android.database.sqlite.SQLiteDatabase;
  7. import android.database.sqlite.SQLiteException;
  8. import android.os.Bundle;
  9. import android.view.View;
  10. import android.widget.ArrayAdapter;
  11. import android.widget.Button;
  12. import android.widget.EditText;
  13. import android.widget.ListView;
  14. import android.widget.Toast;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  18. private EditText nameEditText;
  19. private Button insertButton;
  20. private Button readButton;
  21. private ListView detailsListView;
  22. private DatabaseHelper databaseHelper;
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.activity_main);
  27. initializeWidgetsMethod();
  28. }
  29. @Override
  30. protected void onDestroy() {
  31. super.onDestroy();
  32. databaseHelper.close();
  33. }
  34. private void insertionMethod(String name) {
  35. // 获取可写模式下的数据仓库
  36. SQLiteDatabase sqLiteDatabase = databaseHelper.getWritableDatabase();
  37. // 创建一个新的值映射,其中列是键
  38. ContentValues contentValues = new ContentValues();
  39. contentValues.put(DatabaseHelperContract.DatabaseSchema.COLUMN_NAME, name);
  40. try {
  41. long newRowID = sqLiteDatabase.insert(DatabaseHelperContract.DatabaseSchema.TABLE_NAME, null, contentValues);
  42. Toast.makeText(this, "新创建行的ID:" + newRowID, Toast.LENGTH_SHORT).show();
  43. } catch (SQLException exception) {
  44. exception.printStackTrace();
  45. }
  46. }
  47. private void readMethod() {
  48. SQLiteDatabase sqLiteDatabase = databaseHelper.getReadableDatabase();
  49. String[] projection = {DatabaseHelperContract.DatabaseSchema.COLUMN_NAME};
  50. try {
  51. Cursor cursor = sqLiteDatabase.query(
  52. DatabaseHelperContract.DatabaseSchema.TABLE_NAME,
  53. projection,
  54. null,
  55. null,
  56. null,
  57. null,
  58. null);
  59. List<String> itemIDs = new ArrayList<>();
  60. while (cursor.moveToNext()) {
  61. String name = cursor.getString(cursor.getColumnIndex(DatabaseHelperContract.DatabaseSchema.COLUMN_NAME));
  62. itemIDs.add(name);
  63. }
  64. cursor.close();
  65. displayMethod(itemIDs);
  66. } catch (SQLiteException exception) {
  67. exception.printStackTrace();
  68. }
  69. }
  70. private void displayMethod(List<String> list) {
  71. ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, list);
  72. detailsListView.setAdapter(arrayAdapter);
  73. }
  74. @Override
  75. public void onClick(View view) {
  76. if (view == readButton) {
  77. readMethod();
  78. }
  79. if (view == insertButton) {
  80. String name = nameEditText.getText().toString();
  81. insertionMethod(name);
  82. }
  83. }
  84. private void initializeWidgetsMethod() {
  85. nameEditText = findViewById(R.id.name_edit_text);
  86. insertButton = findViewById(R.id.insert_button);
  87. readButton = findViewById(R.id.read_button);
  88. detailsListView = findViewById(R.id.details_list_view);
  89. databaseHelper = new DatabaseHelper(getApplicationContext());
  90. }
  91. }

注:我知道数据库事务很昂贵,应始终在异步中执行。此代码仅用于练习,稍后我会在后续阶段执行所有这些操作。

英文:

Started with SQLite in Android this evening. Practiced all the code from the Google documentation but it's still going wrong and I can't figure out where I'm going wrong. Take a look and see if you can find out any details.

DatabaseHelperContract.java

  1. package com.practice.sqlitepractice;
  2. import android.provider.BaseColumns;
  3. //final class to prevent inheritance
  4. public final class DatabaseHelperContract {
  5. //Create Entry String
  6. public static final String CREATE_ENTRY = &quot;CREATE TABLE &quot; + DatabaseSchema.TABLE_NAME + &quot; (&quot; +
  7. DatabaseSchema._ID + &quot; INTEGER PRIMARY KEY, &quot; + DatabaseSchema.COLUMN_NAME + &quot; TEXT)&quot;;
  8. //private constructor to prevent accidental instantiation
  9. private DatabaseHelperContract(){
  10. }
  11. /*Inner class that defines individual table contents*/
  12. public static class DatabaseSchema implements BaseColumns{
  13. public static final String TABLE_NAME = &quot;details&quot;;
  14. public static final String COLUMN_NAME = &quot;name&quot;;
  15. }
  16. }

DatabaseHelper.class

  1. package com.practice.sqlitepractice;
  2. import android.content.Context;
  3. import android.database.sqlite.SQLiteDatabase;
  4. import android.database.sqlite.SQLiteOpenHelper;
  5. import androidx.annotation.Nullable;
  6. class DatabaseHelper extends SQLiteOpenHelper {
  7. public static final int DATABASE_VERSION = 1;
  8. public static final String DATABASE_NAME = &quot;table.db&quot;;
  9. public DatabaseHelper(@Nullable Context context) {
  10. super(context, DATABASE_NAME, null, DATABASE_VERSION);
  11. }
  12. @Override
  13. public void onCreate(SQLiteDatabase sqLiteDatabase) {
  14. sqLiteDatabase.execSQL(DatabaseHelperContract.CREATE_ENTRY);
  15. }
  16. @Override
  17. public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
  18. }
  19. }

MainActivity.java

  1. package com.practice.sqlitepractice;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.content.ContentValues;
  4. import android.database.Cursor;
  5. import android.database.SQLException;
  6. import android.database.sqlite.SQLiteDatabase;
  7. import android.database.sqlite.SQLiteException;
  8. import android.os.Bundle;
  9. import android.view.View;
  10. import android.widget.ArrayAdapter;
  11. import android.widget.Button;
  12. import android.widget.EditText;
  13. import android.widget.ListView;
  14. import android.widget.Toast;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  18. private EditText nameEditText;
  19. private Button insertButton;
  20. private Button readButton;
  21. private ListView detailsListView;
  22. private DatabaseHelper databaseHelper;
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.activity_main);
  27. initializeWidgetsMethod();
  28. }
  29. @Override
  30. protected void onDestroy() {
  31. super.onDestroy();
  32. databaseHelper.close();
  33. }
  34. private void insertionMethod(String name) {
  35. //gets the data repository in write mode
  36. SQLiteDatabase sqLiteDatabase = databaseHelper.getWritableDatabase();
  37. //create a new map of values, where the columns are the keys
  38. ContentValues contentValues = new ContentValues();
  39. contentValues.put(DatabaseHelperContract.DatabaseSchema.COLUMN_NAME, name);
  40. try {
  41. long newRowID = sqLiteDatabase.insert(DatabaseHelperContract.DatabaseSchema.TABLE_NAME, null, contentValues);
  42. Toast.makeText(this, &quot;ID for newly created row: &quot; + newRowID, Toast.LENGTH_SHORT).show();
  43. } catch (SQLException exception) {
  44. exception.printStackTrace();
  45. }
  46. }
  47. private void readMethod() {
  48. SQLiteDatabase sqLiteDatabase = databaseHelper.getReadableDatabase();
  49. String[] projection = {DatabaseHelperContract.DatabaseSchema.COLUMN_NAME};
  50. try {
  51. Cursor cursor = sqLiteDatabase.query(
  52. DatabaseHelperContract.DatabaseSchema.TABLE_NAME,
  53. projection,
  54. null,
  55. null,
  56. null,
  57. null,
  58. null);
  59. List&lt;String&gt; itemIDs = new ArrayList&lt;&gt;();
  60. while (cursor.moveToNext()) {
  61. String name = cursor.getString(cursor.getColumnIndex(DatabaseHelperContract.DatabaseSchema.COLUMN_NAME));
  62. itemIDs.add(name);
  63. }
  64. cursor.close();
  65. displayMethod(itemIDs);
  66. } catch (SQLiteException exception) {
  67. exception.printStackTrace();
  68. }
  69. }
  70. private void displayMethod(List&lt;String&gt; list) {
  71. ArrayAdapter&lt;String&gt; arrayAdapter = new ArrayAdapter&lt;&gt;(this, android.R.layout.simple_list_item_1, R.id.details_list_view, list);
  72. detailsListView.setAdapter(arrayAdapter);
  73. }
  74. @Override
  75. public void onClick(View view) {
  76. if (view == readButton) {
  77. readMethod();
  78. }
  79. if (view == insertButton) {
  80. String name = nameEditText.getText().toString();
  81. insertionMethod(name);
  82. }
  83. }
  84. private void initializeWidgetsMethod() {
  85. nameEditText = findViewById(R.id.name_edit_text);
  86. insertButton = findViewById(R.id.insert_button);
  87. readButton = findViewById(R.id.read_button);
  88. detailsListView = findViewById(R.id.details_list_view);
  89. databaseHelper = new DatabaseHelper(getApplicationContext());
  90. }
  91. }

Note: I know that database transactions are expensive and should always be performed asynchronously. This code is just for practice and I will be performing all those at a later stage.

答案1

得分: 1

你代码中的问题在于在 displayMethod() 函数中初始化 ArrayAdapter 的方式。这个定义的第三个参数:

  1. ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(
  2. this,
  3. android.R.layout.simple_list_item_1,
  4. R.id.details_list_view,
  5. list
  6. );

R.id.details_list_view,它是 ListView 的资源 ID,而你应该使用一个 TextView 的资源 ID,但前提是你是否已经在 ListView 内创建了一个要使用的 TextView。你创建了这样的 TextView 吗?
如果没有的话,你可以使用默认的 TextView,即不传递这个参数。
所以将代码修改为这样:

  1. ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(
  2. this,
  3. android.R.layout.simple_list_item_1,
  4. list
  5. );
英文:

The problem with your code is the way that you initialize the ArrayAdapter in displayMethod(). <br/>
The 3d argument of this definition:

  1. ArrayAdapter&lt;String&gt; arrayAdapter = new ArrayAdapter&lt;&gt;(
  2. this,
  3. android.R.layout.simple_list_item_1,
  4. R.id.details_list_view,
  5. list
  6. );

is R.id.details_list_view which is the ListView resource id, while you should have used a TextView resource id but only if you have created one to use inside the ListView.<br/>
Did you create such a TextView?<br/>
If not then you can use the default TextView, by not passing this argument.<br/>
So change the code to this:

  1. ArrayAdapter&lt;String&gt; arrayAdapter = new ArrayAdapter&lt;&gt;(
  2. this,
  3. android.R.layout.simple_list_item_1,
  4. list
  5. );

huangapple
  • 本文由 发表于 2020年9月7日 22:39:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/63779753.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定