首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android显示来自sqlit本地db的数据

Android显示来自sqlit本地db的数据
EN

Stack Overflow用户
提问于 2021-12-09 00:30:52
回答 2查看 60关注 0票数 0

我似乎在网上找不到任何解决这个问题的办法。基本上,我正在开发一个应用程序,让用户创建锻炼并查看它们,而我则在视图部分苦苦挣扎。

我的数据库都是通过使用字段、集合和代表来设置用户输入的,用户创建一个训练,用于构建它的表的内容被复制到一个新的表中,并且该表被清除以接受新的输入。

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

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

任何帮助都将不胜感激,谢谢伊恩

EN

回答 2

Stack Overflow用户

发布于 2021-12-09 10:31:54

这有可能吗?如果有,请告诉我怎么做。

这是可能的。

这里有一个工作演示,展示了如何实现。

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

代码语言:javascript
复制
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的活动通过意图附加传递单击项的唯一标识符:-

代码语言:javascript
复制
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();
            }
        });
    }
}

适配器TheAdapter等,用于RecyclerView,包括项单击和项长单击侦听器。单击一个项目的详细信息。长时间单击启动第二个显示单击项的活动:-

代码语言:javascript
复制
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 :-

代码语言:javascript
复制
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))被长时间单击时:-

单击DONE返回到第一个活动。

票数 0
EN

Stack Overflow用户

发布于 2021-12-09 10:35:23

要进行分类,您想列出列表吗?使用一个到多个关系或地图使用空间。我几天前就做过这样的执行工作-请尽管问。

9 9QloavHpM

KOleeYwjGuIwjUA90S3tvpMWkf1dKYjvDDo5qWAbLfoE

要获得先前的ID或名称,只需使用来自第一个回收视图的特定元素的简单绑定(或ID),并在第二个中使用它来显示正确的数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70283364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档