如何在sqlite中保存android复选框状态?

法蒂·奥默尔

所以我有recyclerview复选框Im能够检索的项目,recylerview但是该复选框没有保持选中状态。string在sqlite中设置了复选框值,并为复选框状态使用了true和false。

这是插入方法

public void insertProduct(String is_checked, ...)
    {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put(IS_CHECKED, is_checked);
        db.insert(DB_TABLE,  null, cv);        
    }

和更新方法

public void updateProduct(String is_checked)
    {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put(IS_CHECKED, is_checked);
        db.update(DB_TABLE, cv, IS_CHECKED+"=?", new String[]{is_checked});
    }

并在onbindviewholder适配器的内recyclerview

holder.productName.setOnCheckedChangeListener((compoundButton, b) -> {
            if (b) {
                db.updateProduct("true");
                db.close();
            } else {
                db.updateProduct("false");
                db.close();
            }
        });

在mainactivity中,当我添加到列表时,我将值设置为false db.insertProduct(product_name, list_name, "false");

这将加载所有列表

private void load_products()
    {   
        Cursor cursor = db.getAllProducts();

        if (cursor.getCount() > 0)
        {
            while (cursor.moveToNext())
            {
                product_id.add(cursor.getString(0));
                list_name.add(cursor.getString(1));
                product_name.add(cursor.getString(2));
                checkbox.add(cursor.getString(3));
            }
        }
    }

编辑

这是SQliteOpenHelper

public class DbProducts extends SQLiteOpenHelper {

    private final static String DB_NAME = "products.db";
    private final static String PRODUCT_COLUMN = "product_name";
    private final static String LIST_COLUMN = "list_name";
    private final static String DB_TABLE = "products";
    private final static String ID_COLUMN = "product_id";
    private final static int VERSION = 1;
    private static final String IS_CHECKED = "is_checked";
    private final Context context;

    public DbProducts(Context context)
    {

        super(context, DB_NAME, null, VERSION);
        this.context = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        String createStatement = "CREATE TABLE " + DB_TABLE +
                " ( " + ID_COLUMN +" INTEGER PRIMARY KEY AUTOINCREMENT,"
                + LIST_COLUMN + " TEXT, "
                +PRODUCT_COLUMN+ " TEXT, "
                +IS_CHECKED+ " TEXT)";
        db.execSQL(createStatement);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1)
    {db.execSQL("DROP TABLE IF EXISTS "+DB_TABLE);}

    public Cursor getAllProducts(String list_name)
    {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = null;
        if (db != null)
        {
            String productsQuery = " SELECT * FROM " +DB_TABLE+ " WHERE "+LIST_COLUMN+ "=?";
                cursor = db.rawQuery(productsQuery, new String[]{list_name});
        }
        return cursor;
    }

    public void insertProduct(String product_name, String list_name, String is_checked)
    {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put(PRODUCT_COLUMN, product_name);
        cv.put(LIST_COLUMN, list_name);
        cv.put(IS_CHECKED, is_checked);
        long insert = db.insert(DB_TABLE,  null, cv);
        if (insert == -1)
        {
            Toast.makeText(context, "Failed to add "+product_name+
                    "\nplease try again", Toast.LENGTH_SHORT).show();
        }
        else
        {db.close();}
    }


    public void updateProduct(String product_name, String list_name, String is_checked)
    {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put(PRODUCT_COLUMN, product_name);
        cv.put(LIST_COLUMN, list_name);
        cv.put(IS_CHECKED, is_checked);

        int update = db.update(DB_TABLE, cv, "?", new String[]{product_name});

        if (update == -1)
        {
            Toast.makeText(context, "not updated", Toast.LENGTH_SHORT).show();
        }
        else
        {
            Toast.makeText(context, "updated \n"+"prod "+product_name
                    +" list "+list_name
                    +" status "+is_checked
                    +" num of rows "+update
                    , Toast.LENGTH_LONG).show();
        }
    }
}

和使用的适配器

public class MyproductsAdapter extends RecyclerView.Adapter<MyproductsAdapter.MyproductsViewHolder>
{
    private final ArrayList<String> product_id;
    private final ArrayList<String> product_name;
    private final Context context;

    public MyproductsAdapter(Context context, ArrayList<String> list_name,
                             ArrayList<String> product_id, ArrayList<String> product_name,
                             ArrayList<String>checkbox)
    {

        this.product_id = product_id;
        this.product_name = product_name;
        this.context = context;
    }

    @NonNull
    @Override
    public MyproductsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
    {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.product_wrapper_item, parent, false);
        return new MyproductsAdapter.MyproductsViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyproductsViewHolder holder, int position)
    {
        holder.btun.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view)
            {
                holder.productName.setChecked(true);
                DbProducts db = new DbProducts(context);
                db.updateProduct("name updated","list updated", "true");
            }
        });
        holder.productName.setText(String.valueOf(product_name.get(position)));
        holder.id.setText(String.valueOf(product_id.get(position)));
        holder.productName.setOnCheckedChangeListener((compoundButton, b) -> {
            if (b) {
                DbProducts db = new DbProducts(context);
                db.updateProduct("name updated","list updated", "true");
                //db.close();
                int checked = Color.parseColor("#E4E4E4"); // "SELECTED" IN COLORS.VALUES
                holder.singleProductItem.setBackgroundColor(checked);
            } else
            {
                DbProducts db = new DbProducts(context);
                db.updateProduct("name updated","list updated", "false");
                //db.close();
                int unchecked = Color.parseColor("#FFFFFFFF"); // "SELECTED" IN COLORS.VALUES
                holder.singleProductItem.setBackgroundColor(unchecked);
            }
        });
    }

    @Override
    public int getItemCount()
    {return product_id.size();}

    public static class MyproductsViewHolder extends RecyclerView.ViewHolder
    {
        private final CheckBox productName;
        private final TextView id;
        private final ConstraintLayout singleProductItem;
        private final Button btun;

        public MyproductsViewHolder(@NonNull View itemView)
        {
            super(itemView);
            productName = itemView.findViewById(R.id.checkable_product);
            id = itemView.findViewById(R.id.product_id);
            singleProductItem = itemView.findViewById(R.id.single_product_item);
            btun = itemView.findViewById(R.id.btn);
        }
    }
}
梅兰B

确保的值与IS_CHECKED要存储检查状态值的列的名称完全相同。

另外,您的updateProduct方法对我而言毫无意义。您正在该IS_CHECKED中搜索值,然后设置同一列的值,并且由于此特定列是truefalse,因此很容易会有很多重复的值,并且此更新功能将仅更新第一个结果。

编辑:

您需要搜索主键列,然后设置所需的值。像这样:

public void updateProduct(int productID, String product_name, String list_name, String is_checked)
    {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put(PRODUCT_COLUMN, product_name);
        cv.put(LIST_COLUMN, list_name);
        cv.put(IS_CHECKED, is_checked);
        db.update(DB_TABLE, cv, ID_COLUMN + "=?", new String[]{productID});
    }

现在应该可以使用了。setOnCheckedChangeListener显然,您还应该更改代码块中的代码

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Android应用程序中保存复选框状态

来自分类Dev

如何在Android应用程序中保存复选框状态

来自分类常见问题

在Android Studio中保存复选框状态(记住我)

来自分类Dev

如何在wordpress中保存多个复选框的值

来自分类Dev

如何在recyclerview中保存复选框位置?

来自分类Dev

如何在Rails中保存多个复选框值?

来自分类Dev

如何在wordpress中保存多个复选框的值

来自分类Dev

如何在recyclerview中保存复选框位置?

来自分类Dev

在 Android Studio 中保存复选框

来自分类Dev

Android的按钮onclick如何在sharedpreference中保存自定义复选框状态并在应用重启后获取它

来自分类Dev

在面板/对话框中保存复选框状态

来自分类Dev

drupal 7:在块配置中保存复选框状态

来自分类Dev

如何在MVC4中保留复选框选中状态

来自分类Dev

如何在wordpress插件的自定义元框中保存多个复选框值?

来自分类Dev

如何在数据库的不同行中保存多个复选框值

来自分类Dev

搜索后如何在 rails 中保存复选框参数

来自分类Dev

如何使用codeiginiter从多个复选框中保存

来自分类Dev

如何在MVC中保留复选框列表

来自分类Dev

如何在html / php中保留复选框值

来自分类Dev

如何在 React 中保留复选框值类型?

来自分类Dev

Android:需要在自定义适配器列表视图中保存复选框状态

来自分类Dev

Android:需要在自定义适配器列表视图中保存复选框状态

来自分类Dev

如何保存动态创建复选框的更改状态

来自分类Dev

如何保存列表视图中复选框的状态?

来自分类Dev

PHP / WP刷新后如何保存复选框状态?

来自分类Dev

如何保存复选框的值和状态

来自分类Dev

使用共享的首选项从列表中保存复选框状态

来自分类Dev

保存动态创建复选框的状态

来自分类Dev

如何在android中保存switchcompat的状态?

Related 相关文章

  1. 1

    如何在Android应用程序中保存复选框状态

  2. 2

    如何在Android应用程序中保存复选框状态

  3. 3

    在Android Studio中保存复选框状态(记住我)

  4. 4

    如何在wordpress中保存多个复选框的值

  5. 5

    如何在recyclerview中保存复选框位置?

  6. 6

    如何在Rails中保存多个复选框值?

  7. 7

    如何在wordpress中保存多个复选框的值

  8. 8

    如何在recyclerview中保存复选框位置?

  9. 9

    在 Android Studio 中保存复选框

  10. 10

    Android的按钮onclick如何在sharedpreference中保存自定义复选框状态并在应用重启后获取它

  11. 11

    在面板/对话框中保存复选框状态

  12. 12

    drupal 7:在块配置中保存复选框状态

  13. 13

    如何在MVC4中保留复选框选中状态

  14. 14

    如何在wordpress插件的自定义元框中保存多个复选框值?

  15. 15

    如何在数据库的不同行中保存多个复选框值

  16. 16

    搜索后如何在 rails 中保存复选框参数

  17. 17

    如何使用codeiginiter从多个复选框中保存

  18. 18

    如何在MVC中保留复选框列表

  19. 19

    如何在html / php中保留复选框值

  20. 20

    如何在 React 中保留复选框值类型?

  21. 21

    Android:需要在自定义适配器列表视图中保存复选框状态

  22. 22

    Android:需要在自定义适配器列表视图中保存复选框状态

  23. 23

    如何保存动态创建复选框的更改状态

  24. 24

    如何保存列表视图中复选框的状态?

  25. 25

    PHP / WP刷新后如何保存复选框状态?

  26. 26

    如何保存复选框的值和状态

  27. 27

    使用共享的首选项从列表中保存复选框状态

  28. 28

    保存动态创建复选框的状态

  29. 29

    如何在android中保存switchcompat的状态?

热门标签

归档