ContentProvider中的多表查询

现在我们有两张表。表1----filedetails。表2----menutreeitems。表2中的fileid属性是表1中的_id。这时候我们想要的结果是:通过表2中的fileid拿到表1对应_id中的其他属性如(fileName等)。那么我们就用到了多表查询。具体的实现方法如下:

  1. package com.example.ch_database_multitable.database;

  2. import java.util.ArrayList;

  3. import com.example.ch_database_multitable.model.FileDetailsModel.FileDetailsIds;
  4. import com.example.ch_database_multitable.model.MenuTreeItemsModel.MenuTreeItemsModelIds;

  5. import android.content.ContentProvider;
  6. import android.content.ContentProviderOperation;
  7. import android.content.ContentProviderResult;
  8. import android.content.ContentUris;
  9. import android.content.ContentValues;
  10. import android.content.Context;
  11. import android.content.OperationApplicationException;
  12. import android.content.UriMatcher;
  13. import android.database.Cursor;
  14. import android.database.sqlite.SQLiteDatabase;
  15. import android.database.sqlite.SQLiteException;
  16. import android.database.sqlite.SQLiteQueryBuilder;
  17. import android.database.sqlite.SQLiteOpenHelper;
  18. import android.net.Uri;
  19. import android.provider.BaseColumns;
  20. import android.util.Log;

  21. public class MuliTableContentProvider extends ContentProvider{
  22.         private static final String TAG = "MuliTableContentProvider";

  23.         public static final String AUTHORITY = MuliTableContentProvider.class.getName();
  24.         public static final String DBNAME = "ch.db";
  25.         public static final int DBVERSION =1; 
  26.         private MainDataBaseHelper mOpenHelper;
  27.         private UriMatcher sURIMatcher = null;
  28.         
  29.         /**Table Name*/
  30.         public static final String TABLE_NAME_FILE_DETAILS="filedetails";
  31.         public static final String TABLE_NAME_MENUTREEITEMS = "menutreeitems";
  32.         
  33.         /**Table Id*/
  34.         public static final int TABLE_ID_FILE_DETAILS = 1;
  35.         public static final int TABLE_ID_MENUTREEITEMS = 2;
  36.         //多表ID
  37.         public static final int TABLE_ID_MULITABLE = 3;
  38.         
  39.         public MuliTableContentProvider(){
  40.                 super();
  41.                 sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  42.                 addURIs();
  43.         }
  44.         
  45.         private void addURIs(){
  46.                 //单表操作filedetailsURI
  47.                 sURIMatcher.addURI(AUTHORITY, TABLE_NAME_FILE_DETAILS, TABLE_ID_FILE_DETAILS);
  48.                 //单表操作menutreeitems
  49.                 sURIMatcher.addURI(AUTHORITY, TABLE_NAME_MENUTREEITEMS, TABLE_ID_MENUTREEITEMS);
  50.                 //多表操作(filedetailsURI,menutreeitems)
  51.                 sURIMatcher.addURI(AUTHORITY, TABLE_NAME_MENUTREEITEMS+"/*", TABLE_ID_MULITABLE);
  52.         }
  53.         
  54.         
  55.         @Override
  56.         public boolean onCreate() {
  57.                 mOpenHelper = new MainDataBaseHelper(getContext());
  58.                 return true;
  59.         }
  60.         
  61.         
  62.         protected static final class MainDataBaseHelper extends SQLiteOpenHelper{
  63.                 
  64.                 private Context context;

  65.                 public MainDataBaseHelper(Context context) {
  66.                         super(context, DBNAME, null, DBVERSION);
  67.                         this.context = context;
  68.                 }

  69.                 @Override
  70.                 public void onCreate(SQLiteDatabase db) {
  71.                         
  72.                         //FileDetails
  73.                         db.execSQL("CREATE TABLE " + TABLE_NAME_FILE_DETAILS+" ("+BaseColumns._ID+" VARCHAR PRIMARY KEY,"+
  74. //                                        FileDetailsIds.FILE_ID+ " TEXT, " + 
  75.                                         FileDetailsIds.FILE_NAME+ " TEXT, " + 
  76.                                         FileDetailsIds.EXTENSION+ " TEXT " +  ");"
  77.                                         );
  78.                         
  79.                         //MenuTreeItems
  80.                         db.execSQL("CREATE TABLE "
  81.                                         + TABLE_NAME_MENUTREEITEMS
  82.                                         + " ("
  83.                                         + BaseColumns._ID
  84.                                         + " VARCHAR PRIMARY KEY,"
  85.                                         + MenuTreeItemsModelIds.ITEMID + " TEXT, " 
  86.                                         + MenuTreeItemsModelIds.PARENTITEMID + " TEXT, " 
  87.                                         + MenuTreeItemsModelIds.NAME+ " TEXT, " 
  88.                                         + MenuTreeItemsModelIds.DESCRIPTIONS + " TEXT, "
  89.                                         + MenuTreeItemsModelIds.FILEID + " TEXT, "
  90.                                         + MenuTreeItemsModelIds.ITEMTYPE + " TEXT, "
  91.                                         + MenuTreeItemsModelIds.COMPANYID + " TEXT, "
  92.                                         + MenuTreeItemsModelIds.ROWVERSION + " TEXT, "
  93.                                         + MenuTreeItemsModelIds.ISDELETED + " BOOLEAN" + ");");
  94.                 }

  95.                 @Override
  96.                 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  97.                         db.execSQL(" DROP TABLE IF EXISTS " + TABLE_NAME_FILE_DETAILS);
  98.                         db.execSQL(" DROP TABLE IF EXISTS " + TABLE_NAME_MENUTREEITEMS);
  99.                         onCreate(db);
  100.                 }
  101.                 
  102.         }
  103.         
  104.         
  105.         @Override
  106.         public int bulkInsert(Uri uri, ContentValues[] values) {
  107.                 SQLiteDatabase db = mOpenHelper.getWritableDatabase();
  108.                 String tableName;
  109.                 boolean clearImageOnUpdate = false;
  110.                 
  111.                 switch (sURIMatcher.match(uri)) {
  112.                 case TABLE_ID_MENUTREEITEMS:
  113.                         tableName = TABLE_NAME_MENUTREEITEMS;
  114.                         break;
  115.                 case TABLE_ID_FILE_DETAILS:
  116.                         tableName = TABLE_NAME_FILE_DETAILS;
  117.                         break;

  118.                 default:
  119.                         throw new IllegalArgumentException("Unknown URI " + uri);
  120.                 }
  121.                 return doBulkInsert(db, uri, tableName, values, getContext(),
  122.                                 clearImageOnUpdate);
  123.         }
  124.         
  125.         
  126.         private int doBulkInsert(SQLiteDatabase db,Uri uri,String tableName, ContentValues[] values, Context context,boolean clearImageOnUpdata){
  127.                 db.beginTransaction();
  128.                 int updateOrInsertCnt = 0;
  129.                 try {
  130.                         for (ContentValues value : values) {
  131.                                 long cnt = -1;
  132.                                 cnt = db.update(tableName, value, makeUpdateCond(value), null);
  133.                                 if (cnt <= 0) {
  134.                                         db.insert(tableName, null, value);
  135.                                 }
  136.                                 if (cnt < 0) {
  137.                                         if (value != null)
  138.                                                 Log.e(TAG, "ERROR inserting " + makeUpdateCond(value)
  139.                                                                 + " in table " + tableName);
  140.                                         else
  141.                                                 Log.e(TAG, "ERROR inserting " + " in table "
  142.                                                                 + tableName);
  143.                                 } else {
  144.                                         updateOrInsertCnt++;
  145.                                 }
  146.                         }
  147.                         db.setTransactionSuccessful();
  148.                 } catch (Exception e) {
  149.                         Log.e(TAG,
  150.                                         "ERROR inserting " + " in table " + tableName + " "
  151.                                                         + e.toString());
  152.                         e.printStackTrace();
  153.                 } finally {
  154.                         db.endTransaction();
  155.                 }
  156.                 context.getContentResolver().notifyChange(uri, null);
  157.                 return updateOrInsertCnt;
  158.         }
  159.         
  160.         private static String makeUpdateCond(ContentValues value) {
  161.                 // TODO Auto-generated method stub
  162.                 return BaseColumns._ID + "='" + value.getAsString(BaseColumns._ID)
  163.                                 + "'";
  164.         }
  165.         

  166.         @Override
  167.         public Cursor query(Uri uri, String[] projection, String selection,
  168.                         String[] selectionArgs, String sortOrder) {
  169.                 
  170.                 boolean rawQueryFlag = false;
  171.                 SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
  172.                 boolean rawExecuteFlag = false;
  173.                 switch (sURIMatcher.match(uri)) {
  174.                 case TABLE_ID_FILE_DETAILS:
  175.                         qb.setTables(TABLE_NAME_FILE_DETAILS);
  176.                         break;
  177.                 case TABLE_ID_MENUTREEITEMS:
  178.                         qb.setTables(TABLE_NAME_MENUTREEITEMS);
  179.                         break;
  180.                 case TABLE_ID_MULITABLE://多表查询
  181.                         //首先设置表名(可以理解为sql语句中from后面的内容)
  182.                         qb.setTables(TABLE_NAME_MENUTREEITEMS+" inner join "+TABLE_NAME_FILE_DETAILS);
  183.                         //这里是判断是否有where条件查询(selection可以理解为sql语句中where后面的内容)
  184.                         if (selection != null){  
  185.                 if (selection.length()>0){  
  186.                         selection += " AND "+TABLE_NAME_MENUTREEITEMS + "." +MenuTreeItemsModelIds.FILEID+" = "+TABLE_NAME_FILE_DETAILS + "." + BaseColumns._ID;
  187.                 }  
  188.                 else{  
  189.                         selection = TABLE_NAME_MENUTREEITEMS + "." +MenuTreeItemsModelIds.FILEID+" = "+TABLE_NAME_FILE_DETAILS + "." + BaseColumns._ID;
  190.                 }     
  191.             }  
  192.             else  
  193.             {  
  194.                 selection = TABLE_NAME_MENUTREEITEMS + "." +MenuTreeItemsModelIds.FILEID+" = "+TABLE_NAME_FILE_DETAILS + "." + BaseColumns._ID;  
  195.             }  
  196.                         break;

  197.                 default:
  198.                         break;
  199.                 }
  200.                 SQLiteDatabase db = mOpenHelper.getReadableDatabase();
  201.                 Cursor c;
  202.                 if (rawQueryFlag) {
  203.                         c = db.rawQuery(selection, selectionArgs);
  204.                 } else if (rawExecuteFlag) {
  205.                         db.execSQL(selection);
  206.                         c = null;
  207.                 } else {
  208.                         c = qb.query(db, projection, selection, selectionArgs, null, null,
  209.                                         sortOrder);
  210.                 }
  211.                 return c;
  212.         }

  213.         @Override
  214.         public String getType(Uri uri) {
  215.                 // TODO Auto-generated method stub
  216.                 return null;
  217.         }

  218.         @Override
  219.         public Uri insert(Uri uri, ContentValues values) {
  220.                 ContentValues insertValues;
  221.                 Cursor c = null;
  222.                 SQLiteDatabase db = mOpenHelper.getWritableDatabase();
  223.                 long rowId = 0;
  224.                 if(values != null){
  225.                         insertValues = new ContentValues();
  226.                 }else {
  227.                         insertValues = new ContentValues();
  228.                 }
  229.                 switch (sURIMatcher.match(uri)) {
  230.                 case TABLE_ID_MENUTREEITEMS:
  231.                         rowId = db.insert(TABLE_NAME_MENUTREEITEMS, null, insertValues);
  232.                         break;
  233.                 case TABLE_ID_FILE_DETAILS:
  234.                         rowId = db.insert(TABLE_NAME_FILE_DETAILS, null, insertValues);
  235.                         break;

  236.                 default:
  237.                         break;
  238.                 }
  239.                 if (rowId > 0) {
  240.                         Uri noteUri = ContentUris.withAppendedId(uri, rowId);
  241.                         getContext().getContentResolver().notifyChange(noteUri, null);
  242.                         return noteUri;
  243.                 }
  244.                 throw new SQLiteException("failed to incert row into " + uri);
  245.         }

  246.         @Override
  247.         public int delete(Uri uri, String selection, String[] selectionArgs) {
  248.                 SQLiteDatabase db = mOpenHelper.getReadableDatabase();
  249.                 int count;
  250.                 switch (sURIMatcher.match(uri)) {
  251.                 case TABLE_ID_MENUTREEITEMS:
  252.                         count = db.delete(TABLE_NAME_MENUTREEITEMS, selection, selectionArgs);
  253.                         break;
  254.                 case TABLE_ID_FILE_DETAILS:
  255.                         count = db.delete(TABLE_NAME_FILE_DETAILS, selection, selectionArgs);
  256.                         break;

  257.                 default:
  258.                         break;
  259.                 }
  260.                 return 0;
  261.         }

  262.         @Override
  263.         public int update(Uri uri, ContentValues values, String selection,
  264.                         String[] selectionArgs) {
  265.                 SQLiteDatabase db = mOpenHelper.getWritableDatabase();
  266.                 int count = 0;
  267.                 switch (sURIMatcher.match(uri)) {
  268.                 case TABLE_ID_MENUTREEITEMS:
  269.                         count = db.update(TABLE_NAME_MENUTREEITEMS, values, selection, selectionArgs);
  270.                         break;
  271.                 case TABLE_ID_FILE_DETAILS:
  272.                         count = db.update(TABLE_NAME_FILE_DETAILS, values, selection, selectionArgs);
  273.                         break;

  274.                 default:
  275.                         break;
  276.                 }
  277.                 getContext().getContentResolver().notifyChange(uri, null);
  278.                 return count;
  279.         }
  280.         
  281.         
  282.         @Override
  283.         public ContentProviderResult[] applyBatch(
  284.                         ArrayList operations)
  285.                         throws OperationApplicationException {
  286.                 final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
  287.                 db.beginTransaction();

  288.                 try {
  289.                         ContentProviderResult[] results = super.applyBatch(operations);
  290.                         db.setTransactionSuccessful();
  291.                         return results;
  292.                 } finally {
  293.                         db.endTransaction();
  294.                 }
  295.         }

  296. }
  297. 下面是DAO函数的具体操作:
    1. package com.example.ch_database_multitable.dao;

    2. import java.util.ArrayList;

    3. import com.example.ch_database_multitable.database.MuliTableContentProvider;
    4. import com.example.ch_database_multitable.model.MenuItemModel;
    5. import com.example.ch_database_multitable.model.FileDetailsModel.FileDetailsIds;
    6. import com.example.ch_database_multitable.model.MenuItemModel.MenuItemModelIds;
    7. import com.example.ch_database_multitable.model.MenuTreeItemsModel.MenuTreeItemsModelIds;


    8. import android.content.ContentProviderClient;
    9. import android.content.ContentResolver;
    10. import android.content.ContentValues;
    11. import android.database.Cursor;
    12. import android.net.Uri;
    13. import android.os.RemoteException;
    14. import android.provider.BaseColumns;

    15. public class MenuTreeItemsDAO extends BaseDAO{
    16.         
    17.         public static Uri CONTENT_URI = Uri.parse("content://" +
    18.                         MuliTableContentProvider.AUTHORITY + "/" + 
    19.                         MuliTableContentProvider.TABLE_NAME_MENUTREEITEMS);

    20.         public MenuTreeItemsDAO(ContentResolver contentResolver) {
    21.                 super(contentResolver);
    22.         }

    23.         @Override
    24.         protected ContentValues makeIdUpdate(ContentValues mContentVals) {
    25.                 if(mContentVals.containsKey(MenuTreeItemsModelIds.ITEMID)){
    26.                         String itemId = mContentVals.getAsString(MenuTreeItemsModelIds.ITEMID);
    27.                         mContentVals.remove(MenuTreeItemsModelIds.ITEMID);
    28.                         mContentVals.put(BaseColumns._ID, itemId);
    29.                 }else{
    30.                         throw new IllegalArgumentException("MenuInfo Item Must Contain a itemId");
    31.                 }
    32.                 return mContentVals;
    33.         }
    34.         
    35.         /**
    36.          * 多表查询
    37.          * @param companyId 根据公司id查询
    38.          * @return
    39.          */
    40.         public  ArrayList queryMultiTable(String companyId) {
    41.                 //projection代表查询结果返回的列
    42.                 String[] projection = {
    43.                                 "menutreeitems." + MenuTreeItemsModelIds.ITEMID,
    44.                                 "menutreeitems." + MenuTreeItemsModelIds.COMPANYID,
    45.                                 "menutreeitems." + MenuTreeItemsModelIds.DESCRIPTIONS,
    46.                                 "menutreeitems." + MenuTreeItemsModelIds.FILEID,
    47.                                 "menutreeitems." + MenuTreeItemsModelIds.ISDELETED,
    48.                                 "menutreeitems." + MenuTreeItemsModelIds.ITEMTYPE,
    49.                                 "menutreeitems." + MenuTreeItemsModelIds.NAME,
    50.                                 "menutreeitems." + MenuTreeItemsModelIds.PARENTITEMID,
    51.                                 "menutreeitems." + MenuTreeItemsModelIds.ROWVERSION,
    52.                                 "filedetails." + BaseColumns._ID,
    53.                                 "filedetails." + FileDetailsIds.EXTENSION,
    54.                                 "filedetails." + FileDetailsIds.FILE_NAME};
    55.                 //在这里多表查询的URI是重点CONTENT_URI(当前表的URI)          "filedetails"(代表另一张表的表名)
    56.                 Uri uri = Uri.withAppendedPath(CONTENT_URI, "filedetails");
    57.                 Cursor c = null;
    58.                 ContentProviderClient client = mContentResolver.acquireContentProviderClient(MuliTableContentProvider.AUTHORITY);
    59.                 try {
    60.                         c = client.query(uri, projection, MenuItemModelIds.COMPANYID+"="+companyId, null, null);
    61.                         
    62.                 } catch (RemoteException e) {
    63.                         e.printStackTrace();
    64.                 }
    65.                 //创建ArrayList用来存放数据
    66.                 ArrayList dataList = new ArrayList();
    67.                 //将指针移动到第一行
    68.                 c.moveToFirst();
    69.                 while(!c.isAfterLast()){
    70.                         String itemId = c.getString(c.getColumnIndex(BaseColumns._ID));
    71.                         String parentItemId = c.getString(c.getColumnIndex(MenuTreeItemsModelIds.PARENTITEMID));
    72.                         String name = c.getString(c.getColumnIndex(MenuTreeItemsModelIds.NAME));
    73.                         String descriptions = c.getString(c.getColumnIndex(MenuTreeItemsModelIds.DESCRIPTIONS));
    74.                         String fileId = c.getString(c.getColumnIndex(MenuTreeItemsModelIds.FILEID));
    75.                         String itemType = c.getString(c.getColumnIndex(MenuTreeItemsModelIds.ITEMTYPE));
    76. //                        String companyId = c.getString(c.getColumnIndex(RoomAndTableTreeItemsModelIds.NAME));
    77.                         String rowVersion = c.getString(c.getColumnIndex(MenuTreeItemsModelIds.ROWVERSION));
    78.                         String isDeleted = c.getString(c.getColumnIndex(MenuTreeItemsModelIds.ISDELETED));
    79.                         
    80.                         String fileName = c.getString(c.getColumnIndex(FileDetailsIds.FILE_NAME));
    81.                         
    82.                         
    83.                         MenuItemModel model = new MenuItemModel();
    84.                         model.setItemId(itemId);
    85.                         model.setParentItemId(parentItemId);
    86.                         model.setName(name);
    87.                         model.setDescriptions(descriptions);
    88.                         model.setFileId(fileId);
    89.                         model.setItemType(itemType);
    90.                         model.setRowVersion(rowVersion);
    91.                         model.setIsDeleted(isDeleted);
    92.                         model.setFileName(fileName);
    93.                         dataList.add(model);
    94.                         c.moveToNext();
    95.                         }
    96.                 
    97.                 
    98.                         c.close();        
    99.                         return dataList;
    100.         }
    101.         

    102.         @Override
    103.         protected Uri getContentURI() {
    104.                 // TODO Auto-generated method stub
    105.                 return CONTENT_URI;
    106.         }
    107.         
    108.         

    109. }



你可能感兴趣的:(ContentProvider中的多表查询)