`
trygood
  • 浏览: 79155 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ContentProvider-4多表

阅读更多
我的理解:其实ContentProvider的机制很随意,它就类似于一个服务器一样,你把uri传来,只要按照特定的方式,它就能给你特定的功能,我觉得这个机制自由又方便。
其实这两个功能主要通过修改query就可以,完整的ContentProvider代码如下:


view plaincopy to clipboardprint?
1. package com.ianc.lilyprovider;  
2. import android.content.ContentProvider;  
3. import android.content.ContentValues;  
4. import android.content.Context;  
5. import android.content.UriMatcher;  
6. import android.database.Cursor;  
7. import android.database.sqlite.SQLiteDatabase;  
8. import android.database.sqlite.SQLiteOpenHelper;  
9. import android.net.Uri;  
10. import android.util.Log;  
11. public class LilyProvider extends ContentProvider {  
12.     final static String TABLE_NAME = "customer";  
13.     final static String PRODUCT_TABLE = "shoplist";  
14.     private static final String  DATABASE_NAME = "lily.db";  
15.     private static String AUTHORITY = "com.ianc.lilyprovider";  
16.     private static final int DATABASE_VERSION = 1;  
17.       
18.     DatabaseHelper mDbHelper;  
19.     static UriMatcher sUriMatcher;  
20.     private static final int USER = 1;  
21.     private static final int USER_NAME = 2;  
22.     private static final int MULITABLE = 3;  
23.     private static final int SHOPLIST = 4;  

// 传入匹配码如果大于0表示匹配根路径或传入-1,即常量UriMatcher.NO_MATCH表示不匹配根路径

// addURI()方法是用来增加其他URI匹配路径的:

// 第一个参数代表传入标识ContentProvider的AUTHORITY字符串

// 第二个参数是要匹配的路径,#代表任意数字,另外还可以用*来匹配任意文本

// 第三个参数必须传入一个大于零的匹配码,用于match()方法对相匹配的URI返回相对应的匹配码

24.     static{  
25.         sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);  
26.         sUriMatcher.addURI(AUTHORITY, TABLE_NAME, USER);  
27.         sUriMatcher.addURI(AUTHORITY, PRODUCT_TABLE, SHOPLIST);  
28.         sUriMatcher.addURI(AUTHORITY, TABLE_NAME+"/"+LilyUser.UserColumns.NAME+"/*", USER_NAME);//search special user by name  
29.         sUriMatcher.addURI(AUTHORITY, TABLE_NAME+"/*", MULITABLE);  
30.     }  
31. //内部类
32.     class DatabaseHelper extends SQLiteOpenHelper {  
33.         public DatabaseHelper(Context context) {  
34.             super(context, DATABASE_NAME, null, DATABASE_VERSION);  
35.         }  
36.         @Override  
37.         public void onCreate(SQLiteDatabase db) {  
38.             Log.i("lily","LilyProvider-->DatabaseHelper-->onCreate");  
39.             db.execSQL("Create table " + TABLE_NAME + "( " +  
40.                     LilyUser.UserColumns._ID+ " INTEGER PRIMARY KEY AUTOINCREMENT, " +  
41.                     LilyUser.UserColumns._COUNT + " INTEGER,"+  
42.                     LilyUser.UserColumns.NAME + " TEXT," +  
43.                     LilyUser.UserColumns.PASSWORD +" TEXT" +  
44.                     ");");  
45.             db.execSQL("Create table " + PRODUCT_TABLE + "( " +  
46.                     LilyUser.ShopListColumns._ID+ " INTEGER PRIMARY KEY AUTOINCREMENT, " +  
47.                     LilyUser.ShopListColumns._COUNT + " INTEGER,"+  
48.                     LilyUser.ShopListColumns.USER_ID+" INTEGER,"+  
49.                     LilyUser.ShopListColumns.PRODUCT + " TEXT," +  
50.                     LilyUser.ShopListColumns.DATE +" TEXT" +  
51.                     ");");  
52.         }  
53.         @Override  
54.         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
55.             Log.i("lily","LilyProvider-->DatabaseHelper-->onUpgrade");  
56.             db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME+";");  
57.             db.execSQL("DROP TABLE IF EXISTS "+PRODUCT_TABLE+";");  
58.             onCreate(db);  
59.         }  
60.           
61.     }  
62.     @Override  
63.     public int delete(Uri arg0, String arg1, String[] arg2) {  
64.         Log.i("lily","LilyProvider-->delete");  
65.         SQLiteDatabase db = mDbHelper.getWritableDatabase();  
66.         int rownum = db.delete(TABLE_NAME, arg1, arg2);  
67.         return rownum;  
68.     }  
69.     @Override  
70.     public String getType(Uri uri) {  
71.         Log.i("lily","LilyProvider-->getType");  
72.         return null;  
73.     }  
74.     @Override  
75.     public Uri insert(Uri uri, ContentValues values) {  
76.         Log.i("lily","LilyProvider-->insert");  
77.         if (sUriMatcher.match(uri) == USER){  
78.             SQLiteDatabase db = mDbHelper.getWritableDatabase();  
79.             db.insert(TABLE_NAME, null, values);  
80.         }  
81.         else if (sUriMatcher.match(uri) == SHOPLIST){  
82.             SQLiteDatabase db = mDbHelper.getWritableDatabase();  
83.             db.insert(PRODUCT_TABLE, null, values);  
84.         }  
85.       
86.         return null;  
87.     }  
88.     @Override  
89.     public boolean onCreate() {  
90.         Log.i("lily","LilyProvider-->onCreate");  
91.         mDbHelper = new DatabaseHelper(this.getContext());  
92.         return false;  
93.     }  
94.     @Override  
95.     public Cursor query(Uri uri, String[] projection, String selection,  
96.             String[] selectionArgs, String sortOrder) {  
97.         Log.i("lily","LilyProvider-->query");  
98.         Log.i("lily","uri = "+uri);  
99.         Log.i("lily","sUriMatcher.match(uri)="+sUriMatcher.match(uri));  
100.         Cursor c = null;  
101.         if (sUriMatcher.match(uri) == USER){  
102.             SQLiteDatabase db = mDbHelper.getReadableDatabase();  
103.             c = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);  
104.         }else if (sUriMatcher.match(uri) == USER_NAME){  
105.               
106.             // format:authority/table/column/value-->0:table 1:column 2:value  
107.             String name = uri.getPathSegments().get(2);// get name value  
108.             Log.i("lily","query table:"+uri.getPathSegments().get(0)+" column:"+uri.getPathSegments().get(1)+" value:"+uri.getPathSegments().get(2));  
109.             SQLiteDatabase db = mDbHelper.getReadableDatabase();  
110.             if (selection != null){  
111.                 if (selection.length()>0){  
112.                     selection += "AND "+LilyUser.UserColumns.NAME+" like "+name;  
113.                 }  
114.             }  
115.             c = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);  
116.         }else if (sUriMatcher.match(uri) == MULITABLE){  
117.             // format:authority/table1/table2  *******
118.             String table1 = uri.getPathSegments().get(0);  
119.             String table2 = uri.getPathSegments().get(1);  
120.               
121.             Log.i("lily","table1 = "+table1);  
122.             Log.i("lily","table2 = "+table2);  
123.               
124.             if (table1.equalsIgnoreCase(TABLE_NAME)){  
125.                 if (table2.equals(PRODUCT_TABLE)){  
126.                     SQLiteDatabase db = mDbHelper.getReadableDatabase();  
127.                     if (selection != null){  
128.                         if (selection.length()>0){  
129.                             selection += "AND "+LilyUser.UserColumns._ID+" = "+LilyUser.ShopListColumns.USER_ID;  
130.                         }  
131.                         else{  
132.                             selection = LilyUser.UserColumns._ID+" = "+LilyUser.ShopListColumns.USER_ID;  
133.                         }     
134.                     }  
135.                     else  
136.                     {  
137.                         selection = TABLE_NAME + "." +LilyUser.UserColumns._ID+" = "+PRODUCT_TABLE + "." + LilyUser.ShopListColumns.USER_ID;  
138.                     }  
139.                     c = db.query(table1+" cross join "+table2, projection, null, selectionArgs, null, null, sortOrder);  
140.                 }  
141.             }  
142.         }  
143.       
144.         return c;  
145.     }  
146.     @Override  
147.     public int update(Uri uri, ContentValues values, String selection,  
148.             String[] selectionArgs) {  
149.         Log.i("lily","LilyProvider-->update");  
150.         SQLiteDatabase db = mDbHelper.getWritableDatabase();  
151.         int rownum = db.update(TABLE_NAME, values, selection, selectionArgs);  
152.         return rownum;  
153.     }  
154. }  
 
这个里面定义Uri格式的时候一定要小心,不然出错了死都查不出来。
下面是使用查询的方法:


view plaincopy to clipboardprint?
1. private void queryNameUri() {  
2.         Uri uri = Uri.withAppendedPath(LilyUser.User.CONTENT_URI, "name/lily");//content://com.ianc.lilyprovider/customer/name/lily  
3.         String[] projection = {LilyUser.UserColumns._ID, LilyUser.UserColumns.NAME, LilyUser.UserColumns.PASSWORD};  
4.         String selection = null;  
5.         String [] selectionArgs = null;  
6.         String sortOrder = null;  
7.         Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);  
8.         if (cursor == null){  
9.             Log.i("lily","cursor == null");  
10.             return;  
11.         }  
12.         if (cursor.moveToFirst()){  
13.             Log.i("lily","*********************************************");  
14.             String id;  
15.             String name;  
16.             String password;  
17.             do{  
18.                 id = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns._ID));  
19.                 Log.i("lily","id = "+id);  
20.                   
21.                 name = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns.NAME));  
22.                 Log.i("lily","name = "+name);  
23.                   
24.                 password = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns.PASSWORD));  
25.                 Log.i("lily","password = "+password);  
26.                   
27.                 Log.i("lily","*********************************************");  
28.             }while(cursor.moveToNext());  
29.         }  
30.         else{  
31.             Log.i("lily","no result");  
32.         }  
33.         cursor.close();  
34.     }  
 多表查询:


view plaincopy to clipboardprint?
1. private void queryMultiTable() {  
2.         String[] projection = {"customer."+LilyUser.UserColumns._ID, "customer."+LilyUser.UserColumns.NAME, "customer."+LilyUser.UserColumns.PASSWORD,   
3.                 "shoplist."+LilyUser.ShopListColumns.USER_ID, "shoplist."+LilyUser.ShopListColumns.PRODUCT, "shoplist."+LilyUser.ShopListColumns.DATE};  
4.         String selection = null;  
5.         String [] selectionArgs = null;  
6.         String sortOrder = null;  
7.         Uri uri = Uri.withAppendedPath(LilyUser.User.CONTENT_URI, "shoplist");  
8.         Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);  
9.         if (cursor == null){  
10.             Log.i("lily","queryMultiTable()-->cursor == null");  
11.             return;  
12.         }  
13.         if (cursor.moveToFirst()){  
14.             Log.i("lily","*********************************************");  
15.             String id;  
16.             String name;  
17.             String password;  
18.             String user_id;  
19.             String product;  
20.             String date;  
21.             do{  
22.                 id = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns._ID));  
23.                 Log.i("lily","id = "+id);  
24.                   
25.                 name = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns.NAME));  
26.                 Log.i("lily","name = "+name);  
27.                   
28.                 password = cursor.getString(cursor.getColumnIndex(LilyUser.UserColumns.PASSWORD));  
29.                 Log.i("lily","password = "+password);  
30.                   
31.                 user_id = cursor.getString(cursor.getColumnIndex(LilyUser.ShopListColumns.USER_ID));  
32.                 Log.i("lily","user_id = "+user_id);  
33.                   
34.                 product = cursor.getString(cursor.getColumnIndex(LilyUser.ShopListColumns.PRODUCT));  
35.                 Log.i("lily","product = " + product);  
36.                   
37.                 date = cursor.getString(cursor.getColumnIndex(LilyUser.ShopListColumns.DATE));  
38.                 Log.i("lily","date = " + date);  
39.                   
40.                 Log.i("lily","*********************************************");  
41.             }while(cursor.moveToNext());  
42.         }  
43.         else{  
44.             Log.i("lily","no result");  
45.         }  
46.         cursor.close();  
47.     }  
 接下来是LilyUser这个说明类的代码:


view plaincopy to clipboardprint?
1. package com.ianc.lilyprovider;  
2. import android.net.Uri;  
3. import android.provider.BaseColumns;  
4. public class LilyUser {  
5.       
6.     public static class User{  
7.         public static final Uri CONTENT_URI = Uri.parse("content://com.ianc.lilyprovider/" + "customer");  
8.     }  
9.     public static class UserColumns implements BaseColumns{   
10.         public static String NAME = "name";  
11.         public static String PASSWORD = "password";  
12.     }  
13.       
14.     public static class ShopList{  
15.         public static final Uri CONTENT_URI = Uri.parse("content://com.ianc.lilyprovider/" + "shoplist");  
16.     }  
17.     public static class ShopListColumns implements BaseColumns{   
18.         public static String USER_ID = "user_id";  
19.         public static String PRODUCT = "product";  
20.         public static String DATE = "date";  
21.     }  
22. }  
分享到:
评论

相关推荐

    contentprovider--读取写入联系人数据

    4. **权限管理** - 因为涉及到敏感数据,读取和写入联系人信息通常需要申请相应的权限,如`<uses-permission android:name="android.permission.READ_CONTACTS" />`和`<uses-permission android:name="android....

    ContentProvider--Demo

    4. **权限控制**:为了保护数据的安全性,可以通过在AndroidManifest.xml中设置权限,限制其他应用对ContentProvider的访问。 在本Demo中,我们假设有一个简单的任务列表应用,数据存储在SQLite数据库中,我们将...

    关于android的数据存储-SQLite-ContentProvider-preferences

    #### 4. 文件I/O操作 除了上述机制,Android还提供了基本的文件I/O操作,如读写文件。这主要通过`FileInputStream`和`FileOutputStream`类实现。开发者可以通过`Context`对象的`openFileInput()`和`openFileOutput...

    ContentProvider多表创建

    总结,创建一个支持多表的ContentProvider,需要设计好数据库结构,实现SQLiteOpenHelper子类,注册ContentProvider,定义URI模式,并在ContentProvider中处理多表的CRUD操作。同时,利用ContentResolver进行数据...

    ContentProvider-Demo:内容提供者的Demo

    ContentProvider通常会有一个或多个Uri来表示不同类型的数据。 6. **CursorLoader和LoaderManager**:在异步加载数据时,Loader和LoaderManager是非常有用的工具。它们可以处理数据的加载和更新,避免阻塞主线程,...

    ContentProvider单个数据库表

    本示例着重讲解如何创建一个针对单一数据库表的ContentProvider,帮助初学者理解其工作原理和使用方法。 首先,我们要明白ContentProvider的基本结构。ContentProvider继承自android.content.ContentProvider类,...

    ContentProvider使用方法demo

    本教程将深入讲解ContentProvider的使用方法,包括基础操作、多ContentProvider管理和多表操作。 首先,基础的ContentProvider用法涉及以下几个步骤: 1. **定义Uri匹配规则**:ContentProvider通过Uri(统一资源...

    Android-Intent-数据存取-ContentProvider.doc

    4. ContentProvider ContentProvider 是 Android 中的一种机制,用于在不同的应用程序之间共享数据。ContentProvider 提供了一个统一的接口,用于访问和操作数据,使得不同的应用程序可以访问和操作同一份数据。 *...

    ContentProvider 实战源码以及apk

    4. 权限控制: - 如果ContentProvider需要特定权限才能访问,可以在AndroidManifest.xml中添加 `<permission>` 和 `<uses-permission>` 标签来设定和请求权限。 - 当ContentProvider设置为 exported=true 时,其他...

    ContentProvider服务端

    4. **权限控制**:为了保护数据安全,可以通过在AndroidManifest.xml中为ContentProvider设置权限,限制只有具有特定权限的应用才能访问。例如,`<provider>`标签中的`android:exported`属性决定是否允许其他应用...

    Android+Room+ContentProvider

    在上述代码中,`User`是数据库中的一个表,`UserDao`定义了操作用户数据的方法,`AppDatabase`是数据库的抽象类,Room会根据这个类自动生成SQLite数据库。 接下来,我们谈谈ContentProvider。ContentProvider是...

    android-关于ContentProvider的使用例子

    4. **ContentResolver与ContentProvider的交互** - 应用程序通过ContentResolver与ContentProvider进行交互,无需直接实例化ContentProvider。 - 使用`ContentResolver.query(Uri uri, String[] projection, ...

    第8章 跨程序共享数据,探究ContentProvider.pptx

    4. ContentProvider 将数据返回给请求方 ContentProvider 的优点 ------------------------- 使用 ContentProvider 有以下几个优点: * 实现跨程序共享数据 * 保证数据安全性 * 提高应用程序之间的数据共享效率 ...

    contentProvider

    2. **ID 字段**:为了支持更高效的数据定位和操作,ContentProvider 建议在数据表中包含一个 `_id` 字段,该字段通常被定义为 `INTEGER PRIMARY KEY AUTOINCREMENT` 类型,以自动生成唯一的标识符。 3. **多进程...

    contentprovider

    同时,合理利用ContentProvider,可以提高应用间的协同能力和用户体验,尤其是在需要在多个应用间共享同一数据源的情况下。但要注意,ContentProvider的使用也需谨慎,避免过度暴露数据,确保应用的安全性。

    ContentProvider

    4. **使用ContentResolver**:在需要访问数据的地方,通过ContentResolver调用上述ContentProvider中的方法。ContentResolver是应用与ContentProvider之间的桥梁,它封装了与ContentProvider交互的细节。 在...

    android contentprovider使用示例

    4. **使用ContentProvider步骤** - **注册ContentProvider**:在AndroidManifest.xml中添加provider标签,设置authority和对应的类。 - **定义UriMatcher**:创建UriMatcher对象,用于匹配不同的Uri请求,返回对应...

    android 用ContentProvider操作文件

    4. 示例代码展示了如何在其他应用中通过ContentResolver访问ContentProvider提供的文件。 通过学习和实践这个案例,你可以更好地理解ContentProvider在文件操作和跨应用通信中的应用。同时,也可以根据需求扩展...

    ContentProvider自定义以及使用系统ContentProvider

    2. **定义URI**:ContentProvider通过URI来识别数据,因此需要定义一个或多个URI模式。通常,使用`UriMatcher`工具类来匹配不同的URI请求。 3. **实现数据操作**:在重写的`query()`、`insert()`、`update()`、`...

    077集-ContentProvider(1)视频教程

    ContentProvider是Android系统中...总的来说,掌握ContentProvider是开发Android应用不可或缺的一部分,尤其是当你需要在多个应用间共享数据时。这个视频教程将帮助你深入了解这一关键组件,提升你的Android开发技能。

Global site tag (gtag.js) - Google Analytics