所谓开桌功能,就是由操作员录入待开桌号与客人人数,把这些信息传送到数据库服务器端的ordertbl表中,而为了减轻服务器端负担,我们将关于桌号等一些信息的表存入客户端的sqlite数据库中,方便客户端读取。而对本地sqlite数据的操作则借助于我们自己编写的ContentProvider类实现。由于有一定的难度,我们把这部分分为上下两个部分,本部分先讨论本地Sqlite的建立,ContentProvider的一些准备工作。
在项目Wireless的com.moka.provider目录中,新建一个元数据接口Tables继承BaseColumns,
public interface Tables extends BaseColumns { // 注意,此处AUTHORITY一定要和Manifest.xml中的配置完全相同 public static final String AUTHORITY = "com.moka.tableprovider"; // 表名 public static final String TABLE_NAME = "TableTbl"; // 访问本表所需的URI public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_NAME); // 字段名 public static final String NUM = "num"; public static final String DESCRIPTION = "description"; // 排序操作 public static final String SORT_ORDER = "num DESC"; }
然后新建一个DBHelper类继承SQLiteOpenHelper,主要负责初始化的时候建立存储桌号等信息的数据表
一些知识点:DBHelper的onCreate方法只在第一次建立数据库后并且调用getReadableDatabase()时才会调用,onUpgrade()方法只在版本号变化时调用。
public class DBHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "Wireless.db"; private static final int DATABASE_VERSION = 1; public DBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + Tables.TABLE_NAME + " (" + Tables._ID + " INTEGER PRIMARY KEY," + Tables.NUM + " INTEGER(11)," + Tables.DESCRIPTION + " TEXT" + ");"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + Tables.TABLE_NAME); onCreate(db); } }
然后来写ContentProvider:
关于ContentProvider的更详细内容,可见http://www.cnblogs.com/moka/archive/2013/05/05/3060708.html,这里与它大同小异。
public class TableProvider extends ContentProvider { private DBHelper helper = null; private static UriMatcher uriMatcher = null; private static final int GET_LIST = 1; private static final int GET_ITEM = 2; static { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(Tables.AUTHORITY, Tables.TABLE_NAME, GET_LIST); uriMatcher.addURI(Tables.AUTHORITY, Tables.TABLE_NAME + "/#", GET_ITEM); } @Override public boolean onCreate() { helper = new DBHelper(getContext()); helper.getReadableDatabase(); return true; } @Override public String getType(Uri uri) { // 暂时不需要查看类型 return null; } @Override public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db = this.helper.getWritableDatabase() ; long id = 0 ; switch(uriMatcher.match(uri)) { case GET_LIST : // 插入数据操作 id = db.insert(Tables.TABLE_NAME, Tables._ID, values); String uriPath = uri.toString() ; String path = uriPath + "/" + id ; return Uri.parse(path) ; case GET_ITEM : return null ; default: throw new UnsupportedOperationException("Not Support Operation :" + uri); } } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // 获得可读数据库 SQLiteDatabase db = helper.getReadableDatabase(); switch (uriMatcher.match(uri)) { case GET_LIST: return db.query(Tables.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder); case GET_ITEM: long id = ContentUris.parseId(uri) ; String where = "_id=" + id ; return db.query(Tables.TABLE_NAME, projection, where, selectionArgs, null, null, sortOrder); default: throw new UnsupportedOperationException("Not Support Operation :" + uri); } } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // 暂时不需要更新操作 return 0; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // 暂时不需要删除操作 return 0; } }
注意在Manifest.xml中的配置,出一点儿错都不行:
<!--authorities一定要与元数据接口中的完全相同-->
<provider
android:name="com.moka.provider.TableProvider"
android:authorities="com.moka.tableprovider"
/>
然后第一次启动时,表就会建立起来,为了方便,我们预先操作了ContentResolver向sqlite中的tabletbl表中插入了10张桌的信息,关于查看sqlite中的数据,推荐使用SQLiteSpy,导入db文件查看非常方便
我们来看看此时TableTbl的内容:
在下一篇中我们会讨论OrderActivity的操作