【问题标题】:Accessing DB from list adapter从列表适配器访问数据库
【发布时间】:2015-11-04 10:32:37
【问题描述】:

我有一个列表视图,其中包含一些我从网络上获得的数据。现在我可以在列表项中进行更改,一旦我对项目进行了更改,我就会将更新的值存储在数据库中。当我下次登录应用程序时,我正在从网络下载内容并将其显示在列表视图中,其中包含我上次所做的更改。所以我的方法是,我在列表适配器的 getview 方法中查询每个项目的数据库以检查更改。对适配器的每个项目的 getview 方法进行数据库查询是一种好习惯吗?如果不能,请给我一些替代方案。谢谢。

【问题讨论】:

  • 我不认为从适配器访问数据库是一个好主意。考虑实现一个接口。
  • 不,我正在在线获取数据,进行更改并将它们存储在 sqlite 设备数据库中。

标签: android listview android-listview android-sqlite android-adapter


【解决方案1】:

永远,真的,永远不要那样做。

如果您将数据下载代码放在适配器的 getView 方法中,它将对列表的每一行进行网络调用。

更糟糕的是,它会在该行出现在屏幕上的任何时候调用它,而不仅仅是一行。

您应该先获取所有数据,然后仅使用适配器进行绘制。

您可以随时调用 db 检查更改,如果需要,通知适配器重新绘制列表以显示更改。

希望这会有所帮助。

【讨论】:

  • 嗯,我没有通过 getView 进行网络通话。它只是 Sqlite 数据库查询。从数据库中获取行。
【解决方案2】:

在 Android 开发中,任何时候您想要显示一个垂直的项目列表,您都需要使用一个 ListView,它使用适配器填充到数据源。当我们希望列表的数据直接来自 SQLite 数据库查询时,我们可以使用 CursorAdapter。

CursorAdapter 位于 Cursor(来自 SQLite 查询的数据源)和 ListView(可视化表示)之间,并配置两个方面:

  1. 为项目扩展哪个布局模板
  2. 光标的哪些字段绑定到模板中的视图

创建视图模板

当我们想要使用项目的自定义表示将一系列项目显示到列表中时,我们需要为每个项目使用我们自己的自定义 XML 布局模板。我们可以简单地在res/layout/item_todo.xml 中创建一个 XML 布局模板,代表一个特定的光标行:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
    <TextView
        android:id="@+id/tvBody"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Study cursors"
        android:textAppearance="?android:attr/textAppearanceLarge" />
    <TextView
        android:id="@+id/tvPriority"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:text="3"
        android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>

定义适配器

public class ViewAdapter extends BaseAdapter {

        LayoutInflater mInflater;

        public ViewAdapter() { 
            mInflater = LayoutInflater.from(context);
        } 

        @Override 
        public int getCount() { 
            return favoriteList.size(); 
        } 

        @Override 
        public Object getItem(int position) {
            return null; 
        } 

        @Override 
        public long getItemId(int position) {
            return position;
        } 

        @Override 
        public View getView(final int position, View convertView, ViewGroup parent) {

            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.listitem,null);
            } 

            final TextView nameText = (TextView) convertView.findViewById(R.id.nameText);
            nameText.setText("Name : "+favoriteList.get(position).getName());
            final TextView ageText = (TextView) convertView.findViewById(R.id.ageText);
            ageText.setText("Age : "+favoriteList.get(position).getAge());

            final Button edit = (Button) convertView.findViewById(R.id.edit);
            edit.setOnClickListener(new OnClickListener() {
                @Override 
                public void onClick(View v) {
                    final Dialog dialog = new Dialog(context);
                    dialog.setContentView(R.layout.row);
                    dialog.setTitle("Add Data to Database");
                    final EditText name = (EditText) dialog.findViewById(R.id.name);
                    final EditText age = (EditText) dialog.findViewById(R.id.age);
                    Button Add = (Button) dialog.findViewById(R.id.Add);
                    Add.setText("Add");
                    Add.setOnClickListener(new OnClickListener() {
                        @Override 
                        public void onClick(View v) {
                            if(name.getText().toString() != null && name.getText().toString().length() >0 ){
                                if(age.getText().toString() != null && age.getText().toString().length() >0 ){
                                    db.updateRow(favoriteList.get(position).getId(), name.getText().toString(), age.getText().toString());
                                    favoriteList = db.getFavList(); 
                                    listView.setAdapter(new ViewAdapter()); 
                                    dialog.dismiss();
                                }else{ 
                                    Toast.makeText(getApplicationContext(), "Please Enter the Age", Toast.LENGTH_LONG).show();  
                                } 
                            }else{ 
                                Toast.makeText(getApplicationContext(), "Please Enter the Name", Toast.LENGTH_LONG).show(); 
                            } 
                        } 
                    }); 
                    dialog.show();  
                } 
            }); 
            final Button delete = (Button) convertView.findViewById(R.id.delete);
            delete.setOnClickListener(new OnClickListener() {
                @Override 
                public void onClick(View v) {
                    db.removeFav(favoriteList.get(position).getId());
                    notifyDataSetChanged();
                    favoriteList = db.getFavList(); 
                    listView.setAdapter(new ViewAdapter()); 
                } 
            }); 
            return convertView;
        } 
    } 

创建数据库

DatabaseHandler.java

public class DatabaseHandler extends SQLiteOpenHelper {

    //Database Version 
    private static final int DATABASE_VERSION = 1;
    //Database Name 
    private static final String DATABASE_NAME = "Test";
    //Table Name 
    private static final String TABLE_TEST = "TestTable";
    //Column Name 
    private static final String KEY_ID = "id";
    private static final String KEY_NAME = "name";
    private static final String KEY_AGE = "age";

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

    //Create Table 
    @Override 
    public void onCreate(SQLiteDatabase db) {
        String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_TEST + "("
                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
                + KEY_AGE + " TEXT" + ")";
        db.execSQL(CREATE_CONTACTS_TABLE);
    } 

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

    //Insert Value 
    public void adddata(Context context,String movieId,String songId) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(KEY_NAME, movieId);
        values.put(KEY_AGE, songId); 
        db.insert(TABLE_TEST, null, values);
        db.close(); 
    } 

    //Get Row Count 
    public int getCount() { 
        String countQuery = "SELECT  * FROM " + TABLE_TEST;
        int count = 0;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        if(cursor != null && !cursor.isClosed()){
            count = cursor.getCount();
            cursor.close();
        }    
        return count;
    } 

    //Delete Query 
    public void removeFav(int id) {
        String countQuery = "DELETE FROM " + TABLE_TEST + " where " + KEY_ID + "= " + id ;
        SQLiteDatabase db = this.getReadableDatabase();
        db.execSQL(countQuery);
    } 

    //Get FavList 
    public List<FavoriteList> getFavList(){
        String selectQuery = "SELECT  * FROM " + TABLE_TEST;
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        List<FavoriteList> FavList = new ArrayList<FavoriteList>();
        if (cursor.moveToFirst()) {
            do { 
                FavoriteList list = new FavoriteList();
                list.setId(Integer.parseInt(cursor.getString(0)));
                list.setName(cursor.getString(1));
                list.setAge(cursor.getString(2));
                FavList.add(list);
            } while (cursor.moveToNext());
        } 
        return FavList;
    } 

}

享受.... :)

【讨论】:

    【解决方案3】:

    最好使用游标适配器绑定列表视图。即使数据库发生变化,您也可以使用Loader更新列表。 Loader 回调的 onLoadFinished(Loader loader, D data) 将监视数据的变化,并通过新的调用将它们报告给您。您不应该自己监控数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      相关资源
      最近更新 更多