为什么我的交易 ArrayList 为空?

时间:2021-05-25 23:26:12

标签: android sql sqlite android-recyclerview android-asynctask

我正在尝试在我的数据库中查询交易表,其中 user_id 是用户的 id,如下所示:

SQLiteDatabase db = databaseHelper.getReadableDatabase();

                Cursor cursor = db.query("transactions", null, "user_id=?", new String[]{String.valueOf(integers[0])}, null, null, null);

                if(cursor != null){
                    if(cursor.moveToFirst()){

                        ArrayList<Transaction> transactions = new ArrayList<>();

                        for(int i = 0; i<cursor.getCount(); i++){
                            Transaction transaction = new Transaction();
                            transaction.setDate(cursor.getString(cursor.getColumnIndex("date")));
                            transaction.setDescription(cursor.getString(cursor.getColumnIndex("description")));
                            transaction.setPrice(cursor.getDouble(cursor.getColumnIndex("amount")));
                            transaction.setTitle(cursor.getString(cursor.getColumnIndex("title")));
                            transaction.setTransactionId(cursor.getInt(cursor.getColumnIndex("_id")));

                            transactions.add(transaction);
                            cursor.moveToNext();
                        }

                        cursor.close();
                        db.close();
                        return transactions;


                    }
                }

然后,在这个异步任务的 onPostExecute 中,我这样设置适配器:

if(transactions != null){
                itemsRecView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
                adapter.setTransactions(transactions);
                itemsRecView.setAdapter(adapter);


                Log.d("transactions", transactions + "");
            }

然而,由于某种原因,它没有进入 if(transaction != null){} 块,而是进入 else 块,它只是记录数组列表为空。

更新:我收到此异常:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.krish.recreatemybank.Models.User.get_id()' on a null object reference at com.krish.recreatemybank.Activities.MainActivity.initTransactions(MainActivity.java:72)

...在该行执行。 这里可能出了什么问题?谢谢。

如果需要,这是我的 TransactionsAdapter:

public class TransactionsAdapter extends RecyclerView.Adapter<TransactionsAdapter.ItemViewHolder> {

    Context context;
    ArrayList<Transaction> transactions = new ArrayList<>();

    public TransactionsAdapter(Context context) {
        this.context = context;
    }

    @NonNull
    @NotNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_main, parent, false);
        return new ItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull @NotNull ItemViewHolder holder, int position) {
        holder.title.setText(transactions.get(position).getTitle());
        holder.description.setText(transactions.get(position).getDescription());
        holder.transactionId.setText(transactions.get(position).getTransactionId());
        holder.price.setText(String.valueOf(transactions.get(position).getPrice()));
        holder.date.setText(transactions.get(position).getDate());
    }

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

    public void setTransactions(ArrayList<Transaction> transactions) {
        this.transactions = transactions;
        notifyDataSetChanged();
    }

    class ItemViewHolder extends RecyclerView.ViewHolder{

        TextView title, description, date, price, transactionId;


        public ItemViewHolder(@NonNull @org.jetbrains.annotations.NotNull View itemView) {
            super(itemView);

            title = itemView.findViewById(R.id.itemListTitle);
            description = itemView.findViewById(R.id.itemListDescription);
            date = itemView.findViewById(R.id.itemListDate);
            price = itemView.findViewById(R.id.itemListPrice);
            transactionId = itemView.findViewById(R.id.itemListId);
        }
    }
}

DatabaseHelper.java 中的示例事务:

private void addSampleTransaction(SQLiteDatabase db) {
        utils = new Utils(context);
        User user = utils.isUserLoggedIn();

        if(user != null){
            ContentValues transactionValues = new ContentValues();
            transactionValues.put("type", "sample");
            transactionValues.put("user_id", user.get_id());
            transactionValues.put("description", "Hi TEST");
            transactionValues.put("date", "2021-05-25");
            transactionValues.put("amount", 25.00);

            db.insert("transactions", null, transactionValues);
        }

    }

实用方法:

public void addUserToSharedPreferences(User user){
        SharedPreferences sharedPreferences = context.getSharedPreferences("logged_in_user", Context.MODE_PRIVATE);

        SharedPreferences.Editor editor = sharedPreferences.edit();

        Gson gson = new Gson();

        editor.putString("user", gson.toJson(user));

        editor.apply();
    }



    public User isUserLoggedIn(){

        SharedPreferences sharedPreferences = context.getSharedPreferences("logged_in_user", Context.MODE_PRIVATE);

        Gson gson = new Gson();
        Type type = new TypeToken<User>(){}.getType();

        User user = gson.fromJson(sharedPreferences.getString("user", null), type);
        return user;
    }

在我的 RegisterActivity 中,我是这样查询的,然后将它们添加到共享首选项中:

@Override
        protected User doInBackground(Void... voids) {
            try{
                SQLiteDatabase db = databaseHelper.getWritableDatabase();

                ContentValues userValues = new ContentValues();
                userValues.put("remained_amount", 0.00);
                userValues.put("first_name", first_name);
                userValues.put("last_name", last_name);
                userValues.put("email", emailString);
                userValues.put("password", passwordString);
                userValues.put("address", addressString);

                long userId = db.insert("users", null, userValues);

                Cursor cursor = db.query("users", null, "_id=?", new String[]{String.valueOf(userId)}, null, null, null);

                if(cursor != null){
                    if(cursor.moveToFirst()){
                        User user = new User();
                        user.setRemained_amount(cursor.getDouble(cursor.getColumnIndex("remained_amount")));
                        user.set_id(cursor.getInt(cursor.getColumnIndex("_id")));
                        user.setAddress(cursor.getString(cursor.getColumnIndex("address")));
                        user.setEmail(cursor.getString(cursor.getColumnIndex("email")));
                        user.setPassword(cursor.getString(cursor.getColumnIndex("password")));
                        user.setFirst_name(cursor.getString(cursor.getColumnIndex("first_name")));
                        user.setLast_name(cursor.getString(cursor.getColumnIndex("last_name")));

                        cursor.close();
                        db.close();
                        return user;

                    }else{
                        cursor.close();
                        db.close();
                        return null;
                    }
                }else{
                    db.close();
                    return null;
                }

            }catch (SQLException e){
                e.printStackTrace();
                return null;
            }
        }

        @Override
        protected void onPostExecute(User user) {
            super.onPostExecute(user);
            if(user != null){
                warning.setVisibility(View.GONE);

                Utils utils = new Utils(RegisterActivity.this);
                utils.addUserToSharedPreferences(user);

                Intent intent = new Intent(RegisterActivity.this, MainActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                startActivity(intent);
            }
        }

0 个答案:

没有答案