Android 如何添加&;使用RecyclerView适配器更新SqliteDatabase中的数据

Android 如何添加&;使用RecyclerView适配器更新SqliteDatabase中的数据,android,android-sqlite,android-recyclerview,Android,Android Sqlite,Android Recyclerview,我只是尝试使用RecyclerView创建一个列表,其中每个列表项都包含一个复选框按钮。因此,当用户单击复选框时,它将替换表列的值,例如列country get value“a”,另一方面,uncheck将替换country列的值,将其从“a”替换为“B”或任何内容 有人能帮我吗?任何关于使用可循环使用在SQLite数据库中添加数据的方法以及其他类似方法的建议都将非常有用 下面我已经添加了我的代码供您参考,并提前表示感谢 我的数据库助手类 package com.hfad.ressql;

我只是尝试使用RecyclerView创建一个列表,其中每个列表项都包含一个复选框按钮。因此,当用户单击复选框时,它将替换表列的值,例如列country get value“a”,另一方面,uncheck将替换country列的值,将其从“a”替换为“B”或任何内容

有人能帮我吗?任何关于使用可循环使用在SQLite数据库中添加数据的方法以及其他类似方法的建议都将非常有用

下面我已经添加了我的代码供您参考,并提前表示感谢

我的数据库助手类

    package com.hfad.ressql;

    import android.content.ContentValues;
    import android.content.Context;
    import android.content.Intent;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import com.hfad.ressql.DatabaseContractor.*;

    import java.lang.reflect.Array;
    import java.util.ArrayList;
    import java.util.List;

    public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "workers.db";
    private static final int DATABASE_VERSION =7;

    SQLiteDatabase db;

    public DatabaseHelper( Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
     this.db=db;

     final String SQL_CREATE_TBALE="CREATE TABLE " +  EmployeeDetails.TABLE_NAME + "(" + EmployeeDetails._ID +" INTEGER PRIMARY KEY  AUTOINCREMENT, "+
             EmployeeDetails.COLUMN_FIRSTNAME+" TEXT,  "+EmployeeDetails.COLUMN_LASTNAME+" TEXT, "+EmployeeDetails.COLUMN_COUNTRY+" TEXT)";

     db.execSQL(SQL_CREATE_TBALE);
     fillquestion();

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {



        db.execSQL("DROP TABLE IF EXISTS " + EmployeeDetails.TABLE_NAME);
        onCreate(db);

    }


    public void fillquestion(){
    DataModel o4 = new DataModel("Earth","Soil","B");
    IntertData(o4);
    DataModel o5 = new DataModel("Sun","Light","B");
    IntertData(o5);
    DataModel o6 = new DataModel("Moon","Rock","B");
    IntertData(o6);

    }

    public void IntertData (DataModel data){

        ContentValues contentValues = new ContentValues();
        contentValues.put(EmployeeDetails.COLUMN_FIRSTNAME,     data.getFirstName());
        contentValues.put(EmployeeDetails.COLUMN_LASTNAME,   data.getLastName());
        contentValues.put(EmployeeDetails.COLUMN_COUNTRY, data.country);
        db.insert(EmployeeDetails.TABLE_NAME,null,contentValues);
    }

    public List<DataModel> object1() {
        ArrayList<DataModel> details = new ArrayList<DataModel>();
        db = getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM " + EmployeeDetails.TABLE_NAME, null );
        if (cursor.moveToFirst()) {

            do {
                DataModel object2 = new DataModel();
                object2.setFirstName(cursor.getString(cursor.getColumnIndex(EmployeeDetails.COLUMN_FIRSTNAME)));
                object2.setLastName(cursor.getString(cursor.getColumnIndex(EmployeeDetails.COLUMN_LASTNAME)));
                object2.setCountry(cursor.getString(cursor.getColumnIndex(EmployeeDetails.COLUMN_COUNTRY)));


                details.add(object2);

            } while (cursor.moveToNext());
        }
        cursor.close();
        return details;
    }
}
数据库构造函数

       public final class DatabaseContractor {

       private DatabaseContractor (){}

        public static class EmployeeDetails implements BaseColumns {
        public static final String TABLE_NAME="employy";
        public static final String COLUMN_FIRSTNAME="First_Name";
        public static final String COLUMN_LASTNAME="Last_Name";
        public static final String COLUMN_COUNTRY="Country";
        public static final String COLUMN_FAVO="mfav";


        }

        }
回收器适配器

在这里,我正在努力解决这个问题。我所需要的是,如果我点击复选框,一个预先给定的值将在数据库中更新,同时复选框将被选中,直到用户取消选中为止。当用户取消选中时,数据库将用一个新值替换以前的值。实际上,我只是尝试在表列中包含值,以便将其用作收藏夹或书签列表

    public class RecycAdapter extends       
    RecyclerView.Adapter<RecycAdapter.ViewHolder> {

    List<DataModel> dotamodeldataArraylist;
    Context context;
    SQLiteDatabase db;
    DatabaseHelper helper;
    ContentValues contentValues;
    Cursor cursor;

    public RecycAdapter(List<DataModel> dotamodeldataArraylist,Context context) {
        this.dotamodeldataArraylist=dotamodeldataArraylist;
        this.context=context;
    }

    @Override
    public ViewHolder onCreateViewHolder( ViewGroup parent, int ViewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.itemlist,parent,false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final RecycAdapter.ViewHolder holder, final int position) {

        DataModel obj3= dotamodeldataArraylist.get(position);
        holder.Fnam.setText(obj3.getFirstName());
        holder.Lname.setText(obj3.getLastName());
        holder.Country.setText(obj3.getCountry());
        holder.fav.();
      holder.fav.setChecked(fav);
      final int currentPosition = position;



           final boolean fav = 0==0;
      holder.fav.setChecked(fav);
      final int currentPosition = position;



        holder.fav.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                if(holder.fav.isChecked()){
                   try {
                       contentValues = new ContentValues();
                       contentValues.put(DatabaseContractor.EmployeeDetails.COLUMN_COUNTRY, "B");
                       db.update("DRINK", contentValues, "id_=?", new String[]{Integer.toString(currentPosition)});
                   } catch (SQLException e){
                       Toast.makeText(context,"error" + position , Toast.LENGTH_LONG).show();

                   }

                    Toast.makeText(context,"checked " + position , Toast.LENGTH_LONG).show();

                } if(!holder.fav.isChecked()){
                    Toast.makeText(context,"not checked" + position , Toast.LENGTH_LONG).show();
                }



            }
        });






    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView Fnam,Lname,Country;
        CheckBox fav;
        RelativeLayout relativeLayout;


        public ViewHolder(View itemView) {
            super(itemView);

            Fnam = itemView.findViewById(R.id.name1);
            Lname = itemView.findViewById(R.id.city1);
            Country = itemView.findViewById(R.id.country1);
            fav=itemView.findViewById(R.id.chk);
            relativeLayout = (RelativeLayout)     itemView.findViewById(R.id.layout);

        }
    }


    }
公共类RecycAdapter扩展
RecyclerView.适配器{
列表dotamodeldataArraylist;
语境;
sqlitedb数据库;
数据库助手;
内容价值观内容价值观;
光标;
公共RecycAdapter(列表dotamodeldataArraylist,上下文){
this.dotamodeldataArraylist=dotamodeldataArraylist;
this.context=context;
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-ViewType){
View-View=LayoutInflater.from(parent.getContext()).flate(R.layout.itemlist,parent,false);
返回新的ViewHolder(视图);
}
@凌驾
公共无效onBindViewHolder(最终RecycAdapter.ViewHolder,最终int位置){
DataModel obj3=dotamodeldataArraylist.get(位置);
holder.Fnam.setText(obj3.getFirstName());
holder.Lname.setText(obj3.getLastName());
holder.Country.setText(obj3.getCountry());
持有者。fav.();
保持架fav设置检查(fav);
最终int currentPosition=位置;
最终布尔值fav=0==0;
保持架fav设置检查(fav);
最终int currentPosition=位置;
holder.fav.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(holder.fav.isChecked()){
试一试{
contentValues=新的contentValues();
contentValues.put(DatabaseContractor.EmployeeDetails.COLUMN_COUNTRY,“B”);
update(“DRINK”,contentValues,“id_=?”,新字符串[]{Integer.toString(currentPosition)});
}捕获(SQLE异常){
Toast.makeText(上下文,“error”+位置,Toast.LENGTH_LONG.show();
}
Toast.makeText(上下文,“选中”+位置,Toast.LENGTH_LONG.show();
}如果(!holder.fav.isChecked()){
Toast.makeText(上下文,“未选中”+位置,Toast.LENGTH_LONG.show();
}
}
});
}
@凌驾
public int getItemCount(){
返回dotamodeldataArraylist.size();
}
公共类ViewHolder扩展了RecyclerView.ViewHolder{
TextView Fnam,Lname,国家/地区;
fav;
相对的相对的;
公共视图持有者(视图项视图){
超级(项目视图);
Fnam=itemView.findViewById(R.id.name1);
Lname=itemView.findViewById(R.id.city1);
Country=itemView.findviewbyd(R.id.country1);
fav=itemView.findviewbyd(R.id.chk);
relativeLayout=(relativeLayout)itemView.findViewById(R.id.layout);
}
}
}
视图类

查看所有类

    public class Viewall extends AppCompatActivity {

    RecyclerView recyclerView;
    DatabaseHelper databaseHelper;
    RecycAdapter recycAdapter;
    List<DataModel> dotamodeldataArraylist;
    Context context;
    Button show;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.viewall);

        show = findViewById(R.id.view);
        recyclerView=findViewById(R.id.recycle);

        databaseHelper =new DatabaseHelper(this);
        dotamodeldataArraylist = new ArrayList<DataModel>();
        dotamodeldataArraylist=databaseHelper.object1();
        recycAdapter =new RecycAdapter(dotamodeldataArraylist,this);
        RecyclerView.LayoutManager reLayoutManager =new            
        LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(reLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(recycAdapter);
public类Viewall扩展了appcompative活动{
回收视图回收视图;
数据库助手数据库助手;
RecycAdapter RecycAdapter;
列表dotamodeldataArraylist;
语境;
按钮显示;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.viewall);
show=findviewbyd(R.id.view);
recyclerView=findViewById(R.id.recycle);
databaseHelper=新的databaseHelper(此);
dotamodeldataArraylist=新的ArrayList();
dotamodeldataArraylist=databaseHelper.object1();
recycAdapter=新的recycAdapter(dotamodeldataArraylist,this);
RecyclerView.LayoutManager reLayoutManager=新建
LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(reLayoutManager);
setItemAnimator(新的DefaultItemAnimator());
RecycleView.setAdapter(recycAdapter);

我相信以下内容可以满足您的要求

代码方面存在不少问题。其中一个主要问题是您希望该位置与id相关(即您的\u id列)

列表中第一项的位置是0,除非强制/特别设置值0,即rowid列的别名(您的\u id列是rowid列的别名),否则分配的第一个值将是1,然后可能是2,然后可能是3

因此,在最佳位置将比id小1

如果删除了一行,而不是最后一行,那么位置将减少一个,除非直到删除的行被传递,然后位置将比rowid少2个。更多的删除以及位置和id之间更复杂的关联。我想有人可以想出一个傻瓜式的转换,但简单的方法是确保DataModel具有相应\u id列的值

    public class Viewall extends AppCompatActivity {

    RecyclerView recyclerView;
    DatabaseHelper databaseHelper;
    RecycAdapter recycAdapter;
    List<DataModel> dotamodeldataArraylist;
    Context context;
    Button show;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.viewall);

        show = findViewById(R.id.view);
        recyclerView=findViewById(R.id.recycle);

        databaseHelper =new DatabaseHelper(this);
        dotamodeldataArraylist = new ArrayList<DataModel>();
        dotamodeldataArraylist=databaseHelper.object1();
        recycAdapter =new RecycAdapter(dotamodeldataArraylist,this);
        RecyclerView.LayoutManager reLayoutManager =new            
        LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(reLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(recycAdapter);
public class DataModel {

    public String FirstName;
    public String LastName;
    public String country;

    public long id; //<<<<<<<<<< ADDED also added gettter and setter

    public DataModel() {
    }

    public DataModel(String firstName, String lastName, String country) {
        this(firstName,lastName,country,-1);
    }

    //<<<<<<<<<< ADDED so ID can be set
    public DataModel(String firstName, String lastName, String country, long id) {
        this.FirstName = firstName;
        this.LastName = lastName;
        this.country = country;
        this.id = id;
    }

    public String getFirstName() {
        return FirstName;
    }

    public void setFirstName(String firstName) {
        FirstName = firstName;
    }

    public String getLastName() {
        return LastName;
    }

    public void setLastName(String lastName) {
        LastName = lastName;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public void setId(long id) {
        this.id = id;
    }

    public long getId() {
        return id;
    }
}
public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "workers.db";
    private static final int DATABASE_VERSION =7;

    SQLiteDatabase db;

    public DatabaseHelper( Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        db = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        this.db=db; //<<<<<<< WRONG PLACE as onCreate only ever runs when there is no database

        final String SQL_CREATE_TBALE="CREATE TABLE " +  DatabaseContractor.EmployeeDetails.TABLE_NAME + "(" + DatabaseContractor.EmployeeDetails._ID +" INTEGER PRIMARY KEY  AUTOINCREMENT, "+
                DatabaseContractor.EmployeeDetails.COLUMN_FIRSTNAME+" TEXT,  "+ DatabaseContractor.EmployeeDetails.COLUMN_LASTNAME+" TEXT, "+ DatabaseContractor.EmployeeDetails.COLUMN_COUNTRY+" TEXT)";

        db.execSQL(SQL_CREATE_TBALE);
        fillquestion();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + DatabaseContractor.EmployeeDetails.TABLE_NAME);
        onCreate(db);
    }


    public void fillquestion(){
        IntertData(new DataModel("Earth","Soil","B"));
        IntertData(new DataModel("Sun","Light","B"));
        IntertData(new DataModel("Moon","Rock","B"));
    }

    public void IntertData (DataModel data){

        ContentValues contentValues = new ContentValues();
        contentValues.put(DatabaseContractor.EmployeeDetails.COLUMN_FIRSTNAME,data.getFirstName());
        contentValues.put(DatabaseContractor.EmployeeDetails.COLUMN_LASTNAME,data.getLastName());
        contentValues.put(DatabaseContractor.EmployeeDetails.COLUMN_COUNTRY,data.country);
        db.insert(DatabaseContractor.EmployeeDetails.TABLE_NAME,null,contentValues);
    }

    public List<DataModel> object1() {
        ArrayList<DataModel> details = new ArrayList<>();
        //db = getReadableDatabase(); db has already been set when database was instantiated/constructed
        Cursor cursor = db.rawQuery("SELECT * FROM " + DatabaseContractor.EmployeeDetails.TABLE_NAME, null );
        while (cursor.moveToNext()) {
            details.add(new DataModel(
                    cursor.getString(cursor.getColumnIndex(DatabaseContractor.EmployeeDetails.COLUMN_FIRSTNAME)),
                    cursor.getString(cursor.getColumnIndex(DatabaseContractor.EmployeeDetails.COLUMN_LASTNAME)),
                    cursor.getString(cursor.getColumnIndex(DatabaseContractor.EmployeeDetails.COLUMN_COUNTRY)),
                    cursor.getLong(cursor.getColumnIndex(DatabaseContractor.EmployeeDetails._ID)) //<<<<<<<<< Added so id is available
            ));
        }
        cursor.close();
        return details;
    }
}
public class RecycAdapter extends RecyclerView.Adapter<RecycAdapter.ViewHolder> {

    List<DataModel> dotamodeldataArraylist;
    Context context;
    SQLiteDatabase db;
    DatabaseHelper helper;
    ContentValues contentValues;

    public RecycAdapter(List<DataModel> dotamodeldataArraylist,Context context) {
        this.dotamodeldataArraylist=dotamodeldataArraylist;
        this.context=context;
        helper = new DatabaseHelper(context);
        db = helper.getWritableDatabase();
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int ViewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.itemlist,parent,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final RecycAdapter.ViewHolder holder, final int position) {

        //DataModel obj3= dotamodeldataArraylist.get(position); //<<<<<<<<<< NOT NEEDED
        holder.Fnam.setText(dotamodeldataArraylist.get(position).getFirstName());
        holder.Lname.setText(dotamodeldataArraylist.get(position).getLastName());
        holder.Country.setText(dotamodeldataArraylist.get(position).getCountry());
        holder.fav.setChecked(false); //<<<<<<<<< not stored so initially set to false

        holder.fav.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String newcountry = "B";
                if(holder.fav.isChecked()){
                    if (dotamodeldataArraylist.get(position).getCountry().equals("B")) {
                        newcountry  = "A";
                    }
                    contentValues = new ContentValues();
                    contentValues.put(DatabaseContractor.EmployeeDetails.COLUMN_COUNTRY, newcountry);
                    if (db.update(
                            DatabaseContractor.EmployeeDetails.TABLE_NAME,
                            contentValues,
                            DatabaseContractor.EmployeeDetails._ID +"=?",
                            new String[]{String.valueOf(dotamodeldataArraylist.get(position).getId())}
                            ) > 0) {
                        dotamodeldataArraylist.get(position).setCountry(newcountry);
                        notifyItemChanged(position);
                        Toast.makeText(context,
                                "checked and updated " +
                                        position+ dotamodeldataArraylist.get(position).getFirstName() +
                                        " ID is " + String.valueOf(dotamodeldataArraylist.get(position).getId()),
                                Toast.LENGTH_LONG
                        ).show();
                    } else {
                        Toast.makeText(context,"error" + position , Toast.LENGTH_LONG).show();
                    }
                } else {
                    Toast.makeText(context,"not checked" + position , Toast.LENGTH_LONG).show();
                }
            }
        });
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView Fnam,Lname,Country;
        CheckBox fav;

        public ViewHolder(View itemView) {
            super(itemView);
            Fnam = itemView.findViewById(R.id.name1);
            Lname = itemView.findViewById(R.id.city1);
            Country = itemView.findViewById(R.id.country1);
            fav = itemView.findViewById(R.id.chk);
        }
    }
}
public class Viewall extends AppCompatActivity {

    RecyclerView recyclerView;
    DatabaseHelper databaseHelper;
    RecycAdapter recycAdapter;
    List<DataModel> dotamodeldataArraylist;
    Button show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.viewall);

        show = findViewById(R.id.view);
        recyclerView = findViewById(R.id.recycle);

        databaseHelper = new DatabaseHelper(this);
        dotamodeldataArraylist = databaseHelper.object1();
        recycAdapter = new RecycAdapter(dotamodeldataArraylist, this);
        RecyclerView.LayoutManager reLayoutManager = new
                LinearLayoutManager(this);
        recyclerView.setLayoutManager(reLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(recycAdapter);
    }
}
   holder.chkbox.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
                Values = new ContentValues();
                Values.put(DatabaseContractor.EmployeeDetails.COLUMN_FAVORITE,holder.chkbox.isChecked());
                try{ db.update(DatabaseContractor.EmployeeDetails.TABLE_NAME,
                        Values,
                        DatabaseContractor.EmployeeDetails._ID + "=?",
                        new String[]{String.valueOf(dotamodeldataArraylist.get(position).getId())});

                } catch (SQLException e){
                    Toast.makeText(context,"Error"+position,Toast.LENGTH_LONG).show();
                }
        }
    });