从列表适配器访问DB

时间:2015-11-04 10:32:37

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

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

3 个答案:

答案 0 :(得分:2)

从来没有,真的,永远不会这样做。

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

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

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

您可以随时调用数据库来检查更改,并在需要时通知适配器重绘列表以显示更改。

希望这有帮助。

答案 1 :(得分:1)

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

enter image description here

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

  1. 要为项目充气的布局模板
  2. 光标的哪些字段绑定到模板中的视图
  3. 创建视图模板

    当我们想要使用项目的自定义表示将一系列项目显示到列表中时,我们需要为每个项目使用我们自己的自定义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;
        } 
    

    }

    Enojoys ....:)

答案 2 :(得分:0)

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