首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从列表适配器访问数据库

从列表适配器访问数据库
EN

Stack Overflow用户
提问于 2015-11-04 18:32:37
回答 3查看 1.9K关注 0票数 1

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

EN

回答 3

Stack Overflow用户

发布于 2015-11-04 18:44:10

永远不会,真的,永远不会这么做。

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

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

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

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

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2015-11-04 18:55:01

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

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

  1. 要为项目膨胀的布局模板
  2. 要将光标的哪些字段绑定到模板

中的视图

创建视图模板的

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

代码语言:javascript
运行
复制
    <?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>

定义适配器

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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..。:)

票数 1
EN

Stack Overflow用户

发布于 2015-11-04 19:11:28

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33519523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档