【问题标题】:Android studio displaying data from sqlite local dbAndroid Studio 显示来自 sqlite 本地数据库的数据
【发布时间】:2022-01-13 21:32:44
【问题描述】:

我似乎无法在互联网上找到任何解决此问题的方法。基本上我正在开发一个允许用户创建锻炼并查看它们的应用程序,而我正在努力处理视图部分。

我的数据库都设置了用户输入,使用字段练习、组数和代表,用户创建一个锻炼,用于构建它的表格的内容被复制到一个新的,表格被清除以接受新的输入。

我想使用表名创建一个回收器视图,将所选项目名称传递给下一个片段,并使用用户选择来确定将在下一个回收器视图中显示哪些数据。

这可能吗?如果可以,请告诉我怎么做,我应该在几天内准备好这个应用程序来完成一项任务

任何帮助将不胜感激,谢谢 - Ian

【问题讨论】:

    标签: java sqlite android-studio


    【解决方案1】:

    为了澄清,你想列出清单吗? 使用一对多关系或使用房间映射。 几天前我已经完成了这样的实施,请随时询问。

    https://developer.android.com/training/data-storage/room/relationships?fbclid=IwAR3P_rK8OeOpBpP9jgbL8FqxEKPXPvOaFwFiCMy4pIpblg_aF_9QloavHpM

    https://developer.android.com/training/data-storage/room/relationships?fbclid=IwAR22XINRNxTs3b_KOleeYwjGuIwjUA90S3tvpMWkf1dKYjvDDo5qWAbLfoE

    要获取以前的 ID 或名称,只需使用来自第一个 recyclerview 的特定元素的简单位置(或 ID)束,并在第二个中使用它来显示正确的数据。

    【讨论】:

      【解决方案2】:

      这可能吗?如果可以,请告诉我如何。

      有可能。

      这是一个演示如何工作的演示。

      首先是扩展 SQLiteOPenHelper 的类,通常使用,即本例中的 DatabaseHelper:-

      class DatabaseHelper extends SQLiteOpenHelper {
      
          public static final String DATABASE_NAME = "thedatabase.db";
          public static final int DATABASE_VERSION = 1;
      
          private SQLiteDatabase db;
      
          private DatabaseHelper(Context context) {
              super(context,DATABASE_NAME,null,DATABASE_VERSION);
              db = this.getWritableDatabase();
          }
      
          private static volatile DatabaseHelper instance = null;
          public static DatabaseHelper getInstance(Context context) {
              if (instance == null) {
                  instance = new DatabaseHelper(context);
              }
              return instance;
          }
      
          @Override
          public void onCreate(SQLiteDatabase db) {
              db.execSQL(MyTable.CREATE_SQL);
          }
      
          @Override
          public void onUpgrade(SQLiteDatabase db, int old_version, int new_version) {
      
          }
      
          public long insertMyTableRow(Long id, String item_name) {
              ContentValues cv = new ContentValues();
              cv.put(MyTable.COL_ITEM_NAME,item_name);
              if (id != null && id == 0) {
                  cv.put(MyTable.COl_ID,id);
              }
              return db.insertWithOnConflict(MyTable.TABLE_NAME,null,cv,SQLiteDatabase.CONFLICT_IGNORE);
          }
      
          @SuppressLint("Range")
          public MyTable[] getAllMyTableRowAsArrayOfMyTable() {
              MyTable[] rv = new MyTable[0];
              Cursor csr = db.query(MyTable.TABLE_NAME,null,null,null,null,null,null);
              if (csr.getCount() > 0) {
                  rv = new MyTable[csr.getCount()];
              }
              int idx = 0;
              while (csr.moveToNext()) {
                  rv[idx++] = new MyTable(
                          csr.getLong(csr.getColumnIndex(MyTable.COl_ID)),
                          csr.getString(csr.getColumnIndex(MyTable.COL_ITEM_NAME)
                          )
                  );
              }
              csr.close();
              return rv;
          }
      
          @SuppressLint("Range")
          public MyTable getAMyTableById(long id) {
              MyTable rv = new MyTable(-1,"NOT FOUND");
              Cursor csr = db.query(MyTable.TABLE_NAME,null,MyTable.COl_ID+"=?",new String[]{String.valueOf(id)},null,null,null);
              if (csr.moveToFirst()) {
                  rv = new MyTable(csr.getLong(csr.getColumnIndex(MyTable.COl_ID)),csr.getString(csr.getColumnIndex(MyTable.COL_ITEM_NAME)));
              }
              csr.close();
              return rv;
          }  
      }
      
      class MyTable {
          public static final String TABLE_NAME = (MyTable.class.getSimpleName()).toLowerCase();
          public static final String COl_ID = TABLE_NAME + BaseColumns._ID;
          public static final String COL_ITEM_NAME = TABLE_NAME + "_item_name";
          // and so on
          public static final String CREATE_SQL = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME +
                  "("
                  + COl_ID + " INTEGER PRIMARY KEY"
                  + "," + COL_ITEM_NAME + " TEXT UNIQUE "
                  // and so on
                  + ")";
          long id;
          String itemName;
          MyTable(long id, String item_name) {
              this.id = id;
              this.itemName = item_name;
          }
      }
      

      将被称为 MainActivity2 的活动通过 Intent Extra 传递被点击项目的唯一标识符:-

      public class MainActivity2 extends AppCompatActivity {
      
          public static final String INTENT_EXTRA_MYTABLE_ID = "ie_mytable_id";
          DatabaseHelper dbHelper;
          TextView itemName;
          Button done;
      
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main2);
              itemName = this.findViewById(R.id.item_name);
              done = this.findViewById(R.id.done);
              dbHelper = DatabaseHelper.getInstance(this);
              itemName.setText((dbHelper.getAMyTableById(this.getIntent().getLongExtra(INTENT_EXTRA_MYTABLE_ID,-99))).itemName);
              done.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View view) {
                      finish();
                  }
              });
          }
      }
      

      RecyclerView 的适配器TheAdapter 等,包括Item Click 和Item Long Click 监听器。单击一个项目 Toasts 详细信息。长按启动第二个活动,显示被点击的项目:-

      public class TheAdapter extends RecyclerView.Adapter<TheAdapter.ViewHolder> {
      
          private MyTable[] localData;
          public static class ViewHolder extends RecyclerView.ViewHolder {
      
              private final TextView textView1;
              private final TextView textView2;
              public ViewHolder(View view) {
                  super(view);
                  textView1 = (TextView) view.findViewById(android.R.id.text1);
                  textView2 = (TextView) view.findViewById(android.R.id.text2);
              }
      
              public TextView getTextView1() {
                  return textView1;
              }
              public TextView getTextView2() {
                  return textView2;
              }
          }
      
          public TheAdapter(MyTable[] thedata) {
              localData = thedata;
          }
      
          @NonNull
          @Override
          public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
              View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_2,parent,false);
              return new ViewHolder(view);
          }
      
          @Override
          public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
              holder.getTextView1().setText(String.valueOf(localData[position].id));
              holder.getTextView2().setText(localData[position].itemName);
              holder.itemView.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View view) {
                      Toast.makeText(
                              view.getContext(),
                              "You clicked the Item named "
                                      + localData[holder.getAdapterPosition()].itemName
                                      + " the ID is " + String.valueOf(localData[holder.getAdapterPosition()].id),
                              Toast.LENGTH_SHORT
                      ).show();
                  }
              });
              holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                  @Override
                  public boolean onLongClick(View view) {
                      Intent intent = new Intent(view.getContext(),MainActivity2.class);
                      intent.putExtra(MainActivity2.INTENT_EXTRA_MYTABLE_ID,localData[holder.getAdapterPosition()].id);
                      view.getContext().startActivity(intent);
                      return true;
                  }
              });
          }
      
          @Override
          public int getItemCount() {
              return localData.length;
          }
      }
      

      最后是第一个/初始活动MainActivity:-

      public class MainActivity extends AppCompatActivity {
      
          DatabaseHelper dbHelper;
          RecyclerView myTableList;
          TheAdapter adapter;
          MyTable[] theDataToBeDisplayed;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              myTableList = this.findViewById(R.id.mytable_list);
              dbHelper = DatabaseHelper.getInstance(this);
              addSomeTestingData();
              setupOrRefreshMyTableList();
          }
      
          private void setupOrRefreshMyTableList() {
              theDataToBeDisplayed = dbHelper.getAllMyTableRowAsArrayOfMyTable();
              if (adapter == null) {
                  adapter = new TheAdapter(theDataToBeDisplayed);
                  myTableList.setAdapter(adapter);
                  myTableList.setLayoutManager(
                          new LinearLayoutManager(this)
                  );
              } else {
                  /* handle changed data here */
              }
          }
      
          private void addSomeTestingData() {
              for (int i=0; i < 100; i++) {
                  dbHelper.insertMyTableRow(null, "A" + String.valueOf(i));
              }
          }
      }
      

      运行时:-

      当一个项目(例如 A10(谁的 id 为 11))被长按时:-

      点击完成返回第一个活动。

      【讨论】:

      • 非常感谢!这完全回答了我的问题,希望现在能够通过哈哈
      • @IanSmith 如果您认为答案很好/有帮助/最好的可用答案,请勾选答案以表明它有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多