我正在尝试在我的数据库中查询交易表,其中 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);
}
}