【问题标题】:View added items on reopening the app? (Java - Android Studio)在重新打开应用程序时查看添加的项目? (Java - 安卓工作室)
【发布时间】:2020-12-08 10:27:07
【问题描述】:

我是 Android 开发的初学者。
我一直在尝试构建一个待办事项列表应用程序。
我的应用程序能够接受数据并显示它们。 (下图)

截至目前,当我重新打开应用程序时,这些添加的项目将被重置,列表为空。
我需要的帮助是,当我重新打开应用程序时,如何保持这些添加的项目保持原样。
我知道如何对 textView 和 EditTexts 使用 SharedPreference 概念。但这只是我不知道我如何在 recyclerViews 中应用它。
希望有人愿意指导我完成此操作。

【问题讨论】:

    标签: java android android-studio android-recyclerview


    【解决方案1】:

    您需要为此使用某种数据库,当您添加一个项目时,您还将它保存在选择的数据库中,并且每当您打开应用程序时,在开始时检查数据库是否为空,然后显示如果有的话。

    当您打开应用程序检查您的SharedPreference 并查看列表是否为空时,获取它并将其传递给RecyclerViewAdapter

    数据库示例: 领域, Firebase Firestore 或 Firebase 实时数据库, SharedPreference(虽然这更适合用于缓存而不是大数据), 房间, SQLite。

    【讨论】:

      【解决方案2】:

      阅读您的问题,我感觉您仍然不了解数据持久性和数据库等概念,如果我错了,请纠正我,您可能需要阅读一些关于默认数据库 SQLite 数据库的信息用于安卓设备!请阅读 android 文档以更好地了解它:https://developer.android.com/training/data-storage/sqlite

      我将大致说明您必须遵循的流程:

      1. 您可能想要创建数据类,它将保存项目的所有必要数据。在您的情况下,它将用于保存待办事项。它必须有一个 ID 字段,用于唯一标识它。其他字段包括标题、日期等。我假设您可能已经为这个应用程序创建了它。像这样:
      class TodoItem{
              long id;
              String name;
              long date;
      
              public TodoItem() {
              }
      
              public TodoItem(long id, String name, long data) {
                  this.id = id;
                  this.name = name;
                  this.date = data;
              }
      
              public long getId() {
                  return id;
              }
      
              public void setId(long id) {
                  this.id = id;
              }
      
              public String getName() {
                  return name;
              }
      
              public void setName(String name) {
                  this.name = name;
              }
      
              public long getDate() {
                  return date;
              }
      
              public void setDate(long date) {
                  this.date = date;
              }
          }
      
      1. 第二步是创建将在屏幕上显示数据的视图,您已经为应用创建了该视图。

      2. 第三步也是最重要的一步是数据持久化,您需要创建一个数据库,其中所有数据都必须在需要时添加和稍后检索。我们将为此使用 SQL!

      首先,创建一个 SQL Helper 类:

      
      public class DBHelper extends SQLiteOpenHelper {
      
          public static final String DATABASE_NAME = "MY_DATABASE";
          public static final String TABLE_NAME = "TODO_TABLE";
          public static final String TODO_COLUMN_ID = "ID";
          public static final String TODO_COLUMN_NAME = "NAME";
          public static final String TODO_COLUMN_DATE = "DATE";
          private HashMap hp;
      
          public DBHelper(Context context) {
              super(context, DATABASE_NAME, null, 1);
          }
      
          @Override
          public void onCreate(SQLiteDatabase db) {
              db.execSQL("CREATE TABLE " + TABLE_NAME + "("
                      + TODO_COLUMN_ID + " INTEGER PRIMARY KEY, "
                      + TODO_COLUMN_NAME + " TEXT, "
                      + TODO_COLUMN_DATE + " LONG);");
          }
      
          @Override
          public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
              db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
              onCreate(db);
          }
      }
      
      

      现在在上面的类中添加 2 个函数,一个用于插入一个项目,一个用于获取所有项目(使用光标),如下所示:

      插入元素就像创建Content Values 对象并在数据库上调用插入函数一样简单。

      public boolean insertItem(String title, long date) {
          SQLiteDatabase db = this.getWritableDatabase();
          ContentValues contentValues = new ContentValues();
          contentValues.put(TODO_COLUMN_NAME, title);
          contentValues.put(TODO_COLUMN_DATE, date);
          db.insert(TABLE_NAME, null, contentValues);
          return true;
      }
      

      为了获得所有项目的列表,我们使用游标查询数据库并创建函数返回的待办事项列表。

      
      public ArrayList<TodoItem> getAllItems() {
          ArrayList<TodoItem> items = new ArrayList<>();
      
          SQLiteDatabase db = this.getReadableDatabase();
          Cursor res = db.rawQuery("SELECT * FROM "  + TABLE_NAME, null);
          res.moveToFirst();
          while (!res.isAfterLast()) {
              TodoItem todoItem  = new TodoItem();
              todoItem.setId(res.getLong(res.getColumnIndex(TODO_COLUMN_ID)));
              todoItem.setName(res.getString(res.getColumnIndex(TODO_COLUMN_NAME)));
              todoItem.setDate(res.getLong(res.getColumnIndex(TODO_COLUMN_DATE)));
              items.add(todoItem);
              res.moveToNext();
          }
          return items;
      }
      

      所以现在在活动中你只需要创建一个 DBhelper 类的对象,每当你想将一个对象插入到数据库中时,只需调用 insert 函数,然后当活动再次启动时调用 getAllItems() 函数使用 DBHelper 类获取可以显示给用户的所有待办事项的列表!像这样-

      DBHelper databaseHelper = new DatabaseHelper(this);
      
      databaseHelper.insertItem("buy groceries", System.currentTimeMillis()); // insert an item
      
      ArrayList<TodoItem> items = databaseHelper.getAllItems(); // get a list of all items
      

      【讨论】:

        【解决方案3】:

        如果您只是将添加的项目添加到回收站视图,则不会保存添加的项目。您必须将数据保存在数据库中,然后在您的应用程序启动时从那里检索它。 Room 是 android 提供的一个 android 库,用于使用 SQLite 存储数据,Room 是 SQLite 数据库的包装器。您可以在此处获取有关 Room 库的更多信息:

        link

        【讨论】:

          猜你喜欢
          • 2017-11-30
          • 1970-01-01
          • 2018-12-15
          • 1970-01-01
          • 1970-01-01
          • 2021-02-27
          • 1970-01-01
          • 2014-04-30
          • 2017-09-08
          相关资源
          最近更新 更多