简单使用SimpleCursorAdapter

18
回复
690596
查看
[复制链接]

206

主题

1622

帖子

2721

安币

Android大神

Rank: 6Rank: 6

发表于 2011-11-10 10:50:27 | 显示全部楼层 |阅读模式

如果使用Sqlite,建议和ContentProvider结合使用。这样数据库的生命周期就不用自己管了。然后,如果要在比如ListView中显示,可以使用CursorAdapter。简化的办法是使用子类SimpleCursorAdapter。

以下就介绍一下使用sqlite+content provider+cursor adapter的最简单实现示例。太简单了,示例如图:

首先,要有个Content provider,如不了解如何实现,请参考编写最简单的Content Provider在Content provider实现中使用SQLiteOpenHelper,下面写的是结合二者的:

  1. public class RiverContentProvider extends ContentProvider {

  2.     public static final Uri CONTENT_URI = Uri
  3.             .parse("content://com.easymorse.cp.rivers");

  4.     public static final String _ID = "_id";

  5.     public static final String NAME = "name";

  6.     public static final String LENGTH = "length";

  7.     private static SQLiteDatabase database;

  8.     private static final int DATABASE_VERSION = 2;

  9.     private static final List<River> RIVERS = new ArrayList<River>();

  10.     static {
  11.         River river = new River("长江", 6380);
  12.         RIVERS.add(river);

  13.         river = new River("黄河", 5464);
  14.         RIVERS.add(river);
  15.     }

  16.     @Override
  17.     public int delete(Uri uri, String selection, String[] selectionArgs) {
  18.         // TODO Auto-generated method stub
  19.         return 0;
  20.     }

  21.     @Override
  22.     public String getType(Uri uri) {
  23.         // TODO Auto-generated method stub
  24.         return null;
  25.     }

  26.     @Override
  27.     public Uri insert(Uri uri, ContentValues contentValues) {
  28.         // TODO Auto-generated method stub
  29.         return null;
  30.     }

  31.     @Override
  32.     public boolean onCreate() {
  33.         database = new RiverDatabaseHelper(getContext(), "rivers", null,
  34.                 DATABASE_VERSION).getReadableDatabase();
  35.         return database != null;
  36.     }

  37.     @Override
  38.     public Cursor query(Uri uri, String[] projection, String selection,
  39.             String[] selectionArgs, String sortOrder) {
  40.         return database.query("rivers", projection, selection, selectionArgs,
  41.                 null, null, sortOrder);
  42.     }

  43.     @Override
  44.     public int update(Uri uri, ContentValues values, String selection,
  45.             String[] selectionArgs) {
  46.         // TODO Auto-generated method stub
  47.         return 0;
  48.     }

  49.     private static class RiverDatabaseHelper extends SQLiteOpenHelper {

  50.         public RiverDatabaseHelper(Context context, String name,
  51.                 CursorFactory factory, int version) {
  52.             super(context, name, factory, version);
  53.         }

  54.         @Override
  55.         public void onCreate(SQLiteDatabase database) {
  56.             database.execSQL("create table if not exists rivers("
  57.                     + " _id integer primary key autoincrement," + " name text,"
  58.                     + "length integer" + ");");

  59.             SQLiteStatement statement = database
  60.                     .compileStatement("insert into rivers(name,length) values(?,?)");

  61.             for (River r : RIVERS) {
  62.                 int index = 1;
  63.                 statement.bindString(index++, r.getName());
  64.                 statement.bindLong(index++, r.getLength());
  65.                 statement.executeInsert();
  66.             }

  67.             statement.close();
  68.         }

  69.         @Override
  70.         public void onUpgrade(SQLiteDatabase database, int oldVersion,
  71.                 int newVersion) {
  72.             database.execSQL("drop table if exists rivers");
  73.             onCreate(database);
  74.         }

  75.     }
复制代码
这里写的很简略,没用到的方法都没实现。在总的布局中使用了ListView:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:orientation="vertical" android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent">
  5.     <ListView android:id="@+id/riverList" android:layout_width="fill_parent"
  6.         android:layout_height="fill_parent" />
  7. </LinearLayout>
复制代码
使用了自定义的ListView布局,见:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="match_parent" android:layout_height="wrap_content">
  4.     <TextView android:id="@+id/riverName" android:layout_width="match_parent"
  5.         android:layout_height="wrap_content" />
  6. </LinearLayout>
复制代码
最后是在Activity中使用contentprovider查询的cursor,生成ListView:
  1. public class ListViewActivity extends Activity {

  2.     private ListView riverListView;

  3.     /** Called when the activity is first created. */
  4.     @Override
  5.     public void onCreate(Bundle savedInstanceState) {
  6.         super.onCreate(savedInstanceState);
  7.         setContentView(R.layout.main);

  8.         setRiverListViewAdapter();
  9.     }

  10.     private void setRiverListViewAdapter() {
  11.         riverListView = (ListView) this.findViewById(R.id.riverList);

  12.         Cursor cursor = managedQuery(RiverContentProvider.CONTENT_URI, null,
  13.                 null, null, null);
  14.         CursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.row,
  15.                 cursor, new String[] { RiverContentProvider.NAME },
  16.                 new int[] { R.id.riverName });
  17.         riverListView.setAdapter(adapter);
  18.     }
  19. }
复制代码
源代码见:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

2

主题

187

帖子

17

安币

初级码农

IT男

Rank: 1

QQ达人

QQ
发表于 2011-11-14 22:30:34 | 显示全部楼层
学习了!
努力!!!

0

主题

13

帖子

38

安币

初级码农

Rank: 1

QQ达人

发表于 2011-11-21 21:58:00 | 显示全部楼层
{:soso__8078411727924452759_2:}

0

主题

19

帖子

12

安币

初级码农

Rank: 1

QQ达人

发表于 2011-12-1 23:23:38 | 显示全部楼层
哈哈哈哈哈哈

0

主题

87

帖子

100

安币

程序猿

Rank: 2

发表于 2011-12-5 15:44:37 | 显示全部楼层
{:soso_e179:}

0

主题

39

帖子

49

安币

初级码农

Rank: 1

QQ达人

发表于 2011-12-13 22:00:56 | 显示全部楼层
学习了,呵呵

0

主题

13

帖子

10

安币

初级码农

Rank: 1

发表于 2011-12-29 15:27:36 | 显示全部楼层
学习学习

0

主题

50

帖子

145

安币

程序猿

Rank: 2

QQ达人

发表于 2012-6-15 17:36:31 | 显示全部楼层
study一下、。、
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )