Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将SQlite数据库加载到Recyclerview中?_Java_Android_Sqlite_Android Recyclerview_Android Sqlite - Fatal编程技术网

Java 如何将SQlite数据库加载到Recyclerview中?

Java 如何将SQlite数据库加载到Recyclerview中?,java,android,sqlite,android-recyclerview,android-sqlite,Java,Android,Sqlite,Android Recyclerview,Android Sqlite,我在片段活动中有一个recyclerview,它使用一个按钮打开一个警报对话框来获取两个字符串变量的输入。我已经成功创建了数据库,可以从alertdialog输入向数据库添加项目,但我想在应用程序最初启动时用数据库填充recyclerview。数据库用于存储输入,我希望它填充recyclerview,以便用户可以看到他们以前输入的项目 这是我的片段: public class tab1Expenses extends Fragment { SqlDatabase dbEntry; Array

我在片段活动中有一个recyclerview,它使用一个按钮打开一个警报对话框来获取两个字符串变量的输入。我已经成功创建了数据库,可以从alertdialog输入向数据库添加项目,但我想在应用程序最初启动时用数据库填充recyclerview。数据库用于存储输入,我希望它填充recyclerview,以便用户可以看到他们以前输入的项目

这是我的片段:

public class tab1Expenses extends Fragment {

SqlDatabase dbEntry;

ArrayList<ExRow> expenseList = new ArrayList<>();
RecyclerView recyclerView;
ExpensesAdapter mAdapter;
Button btnEx;
String Na;
String Am;
String message = "Name must be longer than 2 characters";
String message2 = "Please enter valid amount";
Double value;
String am;

public void expenseData() {
    ExRow exs = new ExRow(Na, Am);
    expenseList.add(exs);
    mAdapter.notifyDataSetChanged();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    final View rootView = inflater.inflate(R.layout.tab1expense, container, false);
    btnEx = (Button) rootView.findViewById(R.id.btnEx);
    recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);
    recyclerView.addItemDecoration(new DividerItemDecoration(tab1Expenses.this.getActivity(), LinearLayoutManager.VERTICAL));

    mAdapter = new ExpensesAdapter(expenseList);
    final RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this.getActivity());

    recyclerView.setHasFixedSize(true);
    recyclerView.setClickable(true);
    recyclerView.isFocusable();
    recyclerView.setFocusableInTouchMode(true);
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(mAdapter);

    btnEx.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Brings up Alert Dialog when Add income button is pressed
            add();
        }
    });
    return rootView;
}


public int add() {
    View view = LayoutInflater.from(tab1Expenses.this.getActivity())
            .inflate(R.layout.add_ex, null);
    final EditText txtExName = (EditText) view.findViewById(R.id.exName);
    final EditText txtExAmount = (EditText) view.findViewById(R.id.exAmount);
    //Creates Alert Dialog
    AlertDialog.Builder add = new AlertDialog.Builder(tab1Expenses.this.getActivity());
    add.setCancelable(true)
            .setTitle("Enter Expense:")
            .setView(view)
            .setPositiveButton("Add",
                    //AlertDialog positive button ClickListener
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //Checks for invalid input
                            //If criteria met, expenseData() is called
                            if (txtExAmount.getText().length() > 0 && txtExName.getText().length() > 2 && txtExAmount.getText().length() < 6 && txtExName.getText().length() < 25) {
                                Na = txtExName.getText().toString();
                                am = txtExAmount.getText().toString();
                                value = Double.parseDouble(am);
                                Am = NumberFormat.getCurrencyInstance().format(value);
                                expenseData();

                            }
                            //Toast for invalid input
                            if (txtExName.getText().length() <= 2) {
                                Toast.makeText(tab1Expenses.this.getActivity(), message, Toast.LENGTH_SHORT).show();
                            } else if (txtExAmount.getText().length() == 0) {
                                Toast.makeText(tab1Expenses.this.getActivity(), message2, Toast.LENGTH_SHORT).show();
                            } else if (txtExAmount.getText().length() >= 6) {
                                Toast.makeText(tab1Expenses.this.getActivity(), "You don't make that much", Toast.LENGTH_SHORT).show();
                            } else if (txtExName.getText().length() >= 25) {
                                Toast.makeText(tab1Expenses.this.getActivity(), "Name must be less than 25 characters", Toast.LENGTH_SHORT).show();
                            }
                        }
                    });
    Dialog dialog = add.create();
    dialog.show();

    return 0;
}

public void viewAll() {

        ExRow exrow = new ExRow();
        Cursor res = dbEntry.getAllData();
        exrow.setTitle(res.getString(1));
        exrow.setAmount(res.getString(2));

  }
}
这是我的RecyclerView适配器+视图支架:

public class ExpensesAdapter extends RecyclerView.Adapter<ExpensesAdapter.MyViewHolder> {
public ImageButton mRemoveButton;
private ArrayList<ExRow> expenseList;

public class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView title, amount;

    public MyViewHolder(View view) {
        super(view);
        title = (TextView) view.findViewById(R.id.name);
        amount = (TextView) view.findViewById(R.id.amount);
        mRemoveButton = (ImageButton) view.findViewById(R.id.ib_remove);
    }
}

public ExpensesAdapter(ArrayList<ExRow> expenseList) {
    this.expenseList = expenseList;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.expense_list, parent, false);

    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(final MyViewHolder holder, int position
) {

    ExRow expense = expenseList.get(holder.getAdapterPosition());
    holder.title.setText(expense.getTitle());
    holder.amount.setText(expense.getAmount());
    mRemoveButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            // Remove the item on remove/button click
            int adapterPosition = holder.getAdapterPosition();

            expenseList.remove(adapterPosition);
            notifyItemRemoved(adapterPosition);
            notifyDataSetChanged();
        }
    });
}
@Override
public int getItemCount() {
    return expenseList.size();
公共类ExpensesAdapter扩展了RecyclerView.Adapter{
公共图像按钮mRemoveButton;
私人ArrayList expenseList;
公共类MyViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图标题、金额;
公共MyViewHolder(视图){
超级(视图);
title=(TextView)view.findViewById(R.id.name);
amount=(TextView)view.findViewById(R.id.amount);
mRemoveButton=(ImageButton)view.findViewById(R.id.ib_-remove);
}
}
公共支出报表(ArrayList expenseList){
this.expenseList=expenseList;
}
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.expense_list,父项,false);
返回新的MyViewHolder(itemView);
}
@凌驾
公共无效onBindViewHolder(最终MyViewHolder,int位置
) {
ExRow expense=ExpensList.get(holder.getAdapterPosition());
holder.title.setText(expense.getTitle());
holder.amount.setText(expense.getAmount());
mRemoveButton.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图){
//单击“删除/删除”按钮删除项目
int adapterPosition=holder.getAdapterPosition();
expenseList.移除(适配器位置);
已移除通知项(适配器位置);
notifyDataSetChanged();
}
});
}
@凌驾
public int getItemCount(){
return expenseList.size();

您需要在SQLiteOpenHelper中获取ExRow的列表,而不是光标。因此,不要:

public static Cursor getAllData() {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.rawQuery("select * from " + TABLE_NAME, null);
    return res;

}
您需要返回具有以下内容的列表:

// Your column 
private String[] allColumns = { "ID", "COLUMN_1", "COLUMN_2" };

public List<ExRow> getAllData() {
    List<ExRow> exrows = new ArrayList<>();

    Cursor cursor = database.query("YOUR_TABLE", allColumns, null, null, 
                                   null, null, null);

    if (cursor != null && cursor.moveToFirst()) {
      while (!cursor.isAfterLast()) {

        ExRow exrow = populateModel(cursor);
        exrows.add(exrow);
        cursor.moveToNext();
      }
      cursor.close();
    }
    return exrows;
  }


 private ExRow populateModel(Cursor c) {
    ExRow model = new ExRow();
    model.setId(c.getLong("ID"));
    model.setColumn1(c.getString(c.getColumnIndex("COLUMN_1")));
    model.setColumn2(c.getString(c.getColumnIndex("COLUMN_2")));

    return model;
 }
//您的列
私有字符串[]allColumns={“ID”,“COLUMN_1”,“COLUMN_2”};
公共列表getAllData(){
List exrows=new ArrayList();
Cursor Cursor=database.query(“您的_表”),allColumns,null,null,
空,空,空);
if(cursor!=null&&cursor.moveToFirst()){
而(!cursor.isAfterLast()){
ExRow ExRow=populateModel(光标);
添加(exrow);
cursor.moveToNext();
}
cursor.close();
}
返回exrows;
}
私有ExRow populateModel(光标c){
ExRow模型=新ExRow();
model.setId(c.getLong(“ID”);
model.setColumn1(c.getString(c.getColumnIndex(“COLUMN_1”));
model.setColumn2(c.getString(c.getColumnIndex(“COLUMN_2”));
收益模型;
}

然后可以使用从
getAllData()返回的值
并将其传递给您的适配器。

使用适配器否,他需要一个
光标
感知适配器,就像我在上面的评论中所说的那样如果我们查看op SQLite帮助程序,那么您是对的。但是如果我们查看op适配器,我们可以得出结论,列表就是op答案。我认为重新创建op适配器不是一个好建议。复制op适配器不是一个好主意应用你的数据,如果你的数据已经存储在
游标中,你需要什么
exrows
?这是我第一次在应用程序中使用recyclerviews和sqlite数据库,所以我不知道如何使用游标。任何帮助都很感激:)@carbody然后使用
游标
感知适配器,比如
游标RecyclerAdapter
,yo你会节省很多时间
// Your column 
private String[] allColumns = { "ID", "COLUMN_1", "COLUMN_2" };

public List<ExRow> getAllData() {
    List<ExRow> exrows = new ArrayList<>();

    Cursor cursor = database.query("YOUR_TABLE", allColumns, null, null, 
                                   null, null, null);

    if (cursor != null && cursor.moveToFirst()) {
      while (!cursor.isAfterLast()) {

        ExRow exrow = populateModel(cursor);
        exrows.add(exrow);
        cursor.moveToNext();
      }
      cursor.close();
    }
    return exrows;
  }


 private ExRow populateModel(Cursor c) {
    ExRow model = new ExRow();
    model.setId(c.getLong("ID"));
    model.setColumn1(c.getString(c.getColumnIndex("COLUMN_1")));
    model.setColumn2(c.getString(c.getColumnIndex("COLUMN_2")));

    return model;
 }