java - 如何在 Android 中的自定义适配器类中使用或实例化 Sqlite Database Helper 类实例?

标签 java android sqlite

我是 Android 的绝对初学者。现在我正在创建一个教程项目。在我的项目中,我使用 ListView 和自定义适配器。但我将自定义适配器创建为不同的独立文件,以使我的 Activity 变得干净。但是当我在不同的文件中创建它时,我无法在自定义适配器中使用我的数据库帮助程序类。

问题是我无法将 Activity 上下文传递给数据库帮助器类实例。在 fragment 中,我可以通过调用这个 method.getActivity() 来传递。然后将其传递给我的数据库帮助器类的构造函数。如何在自定义适配器类中执行相同的操作?

这是我的数据库助手类:

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "todo.db";
    private static final String TABLE_NAME = "task";
    private static final String COLUMN_ID = "id";
    private static final String COLUMN_DESCRIPTION = "description";
    private static final String COLUMN_DATE ="date";
    private static final String COLUMN_DONE = "done";
    private static final String CREATE_TABLE = "CREATE TABLE "+TABLE_NAME+" ("+COLUMN_ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"+COLUMN_DESCRIPTION+" TEXT,"+
    COLUMN_DATE+" DATE,"+COLUMN_DONE+" BOOLEAN)";
    SQLiteDatabase db;

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


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

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

    public  void insertTask(Task task)
    {
        db = getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_DESCRIPTION,task.getDescription());
        values.put(COLUMN_DATE,task.getDate());
        values.put(COLUMN_DONE, Boolean.FALSE.toString());
        db.insert(TABLE_NAME, null, values);
        db.close();
    }

    public ArrayList<Task> getAllTasks()
    {
        ArrayList<Task> items = new ArrayList<Task>();
        db = getReadableDatabase();
        String query = "SELECT * FROM "+TABLE_NAME;
        Cursor cursor = db.rawQuery(query,null);
        if(cursor.moveToFirst())
        {
            do{
                Task item = new Task();
                item.setId(cursor.getInt(0));
                item.setDescription(cursor.getString(1));
                item.setDate(cursor.getString(2));
                item.setDone(Boolean.valueOf(cursor.getString(3)));
                items.add(item);
            }
            while (cursor.moveToNext());
        }
        return items;
    }

    public void markAsDone(int id){
        db = getWritableDatabase();
        ContentValues updatedData = new ContentValues();
        updatedData.put(COLUMN_DONE, String.valueOf(Boolean.TRUE));
        String where = COLUMN_ID+" = "+String.valueOf(id);
        db.update(TABLE_NAME,updatedData,where,null);
    } 
}

这是我的 listView 自定义适配器类(TaskListAdapter.java):

public class TaskListAdapter extends ArrayAdapter<Task> {
    private final Context context;
    private final ArrayList<Task> values;
    private DatabaseHelper dbHelper;
    public TaskListAdapter(Context context,ArrayList<Task> values)
    {
        super(context,-1,values);
        this.context = context;
        this.values = values;
    }

    @Override
    public View getView(int position,View convertView,ViewGroup parent)
    {
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView  = inflater.inflate(R.layout.task_list_row,parent, false);
        rowView.setTag(values.get(position).getId());
        TextView rowDescription = (TextView)rowView.findViewById(R.id.task_row_description);
        rowDescription.setText(values.get(position).getDescription());
        ImageView rowStatusIcon = (ImageView)rowView.findViewById(R.id.task_row_status_icon);

        Long currentDateMillSec= System.currentTimeMillis();
        Long dateMillSec = CommonHelper.convertStrDateToMilSec(values.get(position).getDate());//(date==null)?0:date.getTime();
        if(values.get(position).getDone()==Boolean.TRUE)
        {
           rowStatusIcon.setImageResource(R.drawable.done_icon);
        }
        else if(dateMillSec>0 && dateMillSec<currentDateMillSec)
        {
           rowStatusIcon.setImageResource(R.drawable.failed_icon);
        }
        else{
            rowStatusIcon.setImageResource(R.drawable.todo_icon);
        }


        TextView dateTf = (TextView)rowView.findViewById(R.id.task_row_date);
        dateTf.setText(values.get(position).getDate());

        Button doneBtn = (Button)rowView.findViewById(R.id.task_row_done_btn);
        doneBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //how can I instantiate the dbHelper class
                //Then use the merkAsDone method here
            }
        });
        return rowView;
    }


}

如何在自定义适配器中实例化 dbHelper 属性,然后在完成按钮单击事件中调用 markAsDone 方法。当适配器不是在 Activity 中创建时,我该如何实现它?

最佳答案

看起来不是一个大问题,在构造函数中实例化它:

public TaskListAdapter(Context context,ArrayList<Task> values)
{
    super(context,-1,values);
    this.dbHelper = new DatabaseHelper(context.getApplicationContext());
    this.context = context;
    this.values = values;
}

然后在您的 OnClickListener 中使用它:

Button doneBtn = (Button)rowView.findViewById(R.id.task_row_done_btn);
doneBtn.setTag(values.get(position).getId());
doneBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        dbHelper.markAsDone(v.getTag());
    }
});

不要忘记在DatabaseHelper.markAsDone中关闭数据库

关于java - 如何在 Android 中的自定义适配器类中使用或实例化 Sqlite Database Helper 类实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35008914/

相关文章:

ios - 带有 subselect 语句的 SQL 的 SQLite 列名现在以表名作为列名的前缀

sql - 如何按日期、对话线程对数据库中的所有对话进行分组

java - 如何将 kafka 消息反序列化到 POJO?

java - 工作线程在 Netty 中被阻塞

android - 自定义 View 单击监听器,不适用于当前选项卡

Android - 在不保存的情况下发送前调整大小和裁剪图片

java - Blackberry JDE 安装程序找不到 java

java - 有没有可能在 ZKoss Controller 中 Autowiring Spring bean?

java - 如何从JAVA中的String中的列中获取特定部分

ruby-on-rails - 如果我将sqlite3数据库中的字段类型从字符串更改为文本,是否会丢失该字段中的数据?