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

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

首先,要有个Content provider,如不了解如何实现,请参考编写最简单的Content Provider

 

  1. public class RiverContentProvider extends ContentProvider { 
  2.   
  3.     public static final Uri CONTENT_URI = Uri 
  4.             .parse("content://com.easymorse.cp.rivers"); 
  5.   
  6.     public static final String _ID = "_id"
  7.   
  8.     public static final String NAME = "name"
  9.   
  10.     public static final String LENGTH = "length"
  11.   
  12.     private static SQLiteDatabase database; 
  13.   
  14.     private static final int DATABASE_VERSION = 2
  15.   
  16.     private static final List<River> RIVERS = new ArrayList<River>(); 
  17.   
  18.     static { 
  19.         River river = new River("长江"6380); 
  20.         RIVERS.add(river); 
  21.   
  22.         river = new River("黄河"5464); 
  23.         RIVERS.add(river); 
  24.     } 
  25.   
  26.     @Override 
  27.     public int delete(Uri uri, String selection, String[] selectionArgs) { 
  28.         // TODO Auto-generated method stub 
  29.         return 0
  30.     } 
  31.   
  32.     @Override 
  33.     public String getType(Uri uri) { 
  34.         // TODO Auto-generated method stub 
  35.         return null
  36.     } 
  37.   
  38.     @Override 
  39.     public Uri insert(Uri uri, ContentValues contentValues) { 
  40.         // TODO Auto-generated method stub 
  41.         return null
  42.     } 
  43.   
  44.     @Override 
  45.     public boolean onCreate() { 
  46.         database = new RiverDatabaseHelper(getContext(), "rivers"null
  47.                 DATABASE_VERSION).getReadableDatabase(); 
  48.         return database != null
  49.     } 
  50.   
  51.     @Override 
  52.     public Cursor query(Uri uri, String[] projection, String selection, 
  53.             String[] selectionArgs, String sortOrder) { 
  54.         return database.query("rivers", projection, selection, selectionArgs, 
  55.                 nullnull, sortOrder); 
  56.     } 
  57.   
  58.     @Override 
  59.     public int update(Uri uri, ContentValues values, String selection, 
  60.             String[] selectionArgs) { 
  61.         // TODO Auto-generated method stub 
  62.         return 0
  63.     } 
  64.   
  65.     private static class RiverDatabaseHelper extends SQLiteOpenHelper { 
  66.   
  67.         public RiverDatabaseHelper(Context context, String name, 
  68.                 CursorFactory factory, int version) { 
  69.             super(context, name, factory, version); 
  70.         } 
  71.   
  72.         @Override 
  73.         public void onCreate(SQLiteDatabase database) { 
  74.             database.execSQL("create table if not exists rivers(" 
  75.                     + " _id integer primary key autoincrement," + " name text," 
  76.                     + "length integer" + ");"); 
  77.   
  78.             SQLiteStatement statement = database 
  79.                     .compileStatement("insert into rivers(name,length) values(?,?)"); 
  80.   
  81.             for (River r : RIVERS) { 
  82.                 int index = 1
  83.                 statement.bindString(index++, r.getName()); 
  84.                 statement.bindLong(index++, r.getLength()); 
  85.                 statement.executeInsert(); 
  86.             } 
  87.   
  88.             statement.close(); 
  89.         } 
  90.   
  91.         @Override 
  92.         public void onUpgrade(SQLiteDatabase database, int oldVersion, 
  93.                 int newVersion) { 
  94.             database.execSQL("drop table if exists rivers"); 
  95.             onCreate(database); 
  96.         } 
  97.   
  98.     } 

这里写的很简略,没用到的方法都没实现。

在总的布局中使用了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.   
  3.     private ListView riverListView; 
  4.   
  5.     /** Called when the activity is first created. */ 
  6.     @Override 
  7.     public void onCreate(Bundle savedInstanceState) { 
  8.         super.onCreate(savedInstanceState); 
  9.         setContentView(R.layout.main); 
  10.   
  11.         setRiverListViewAdapter(); 
  12.     } 
  13.   
  14.     private void setRiverListViewAdapter() { 
  15.         riverListView = (ListView) this.findViewById(R.id.riverList); 
  16.   
  17.         Cursor cursor = managedQuery(RiverContentProvider.CONTENT_URI, null
  18.                 nullnullnull); 
  19.         CursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.row, 
  20.                 cursor, new String[] { RiverContentProvider.NAME }, 
  21.                 new int[] { R.id.riverName }); 
  22.         riverListView.setAdapter(adapter); 
  23.     }