簡體   English   中英

創建Android內容提供商的更好方法

[英]Better way to create Android content providers

我的應用程序中有一個內容提供商,但我真的不喜歡它:-)。 提供者是在閱讀了一些官方文章和非官方文章之后創建的。

我真正不喜歡的是提供程序類中的重復次數(請參閱下面的精簡代碼)。 即使對於兩種(或四種,取決於您的計數方式)內容類型,代碼也太多了。

我考慮過要走另一條路:在內容提供程序中使用原始SQL查詢,但不確定是否會更優雅。

請提供比下面代碼中的方法更好的創建Android內容提供商的方法。

public abstract class BaseProvider extends ContentProvider
{
    protected DatabaseHelper m_helper;

    protected static class DatabaseHelper extends SQLiteOpenHelper
    {
        private static final String DATABASE_NAME = "my.db";
        private static final int DATABASE_VERSION = 4;

        public DatabaseHelper(Context context)
        {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db)
        {
            FolderTable.onCreate(db);
            TrackTable.onCreate(db);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
        {
            FolderTable.onUpgrade(db, oldVersion, newVersion);
            TrackTable.onUpgrade(db, oldVersion, newVersion);
        }
    }

    @Override
    public boolean onCreate()
    {
        m_helper = new DatabaseHelper(getContext());
        return true;
    }
    // ...
}


public class MyProvider extends BaseProvider
{    
    private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);

    private static final int FOLDERS = 10;
    private static final int FOLDER_ID = 20;
    private static final int TRACKS = 30;
    private static final int TRACK_ID = 40;

    private static final String FOLDERS_BASE_PATH = "folders";
    private static final String TRACKS_BASE_PATH = "tracks";

    public static final String AUTHORITY = ".contentprovider.MyProvider";
    private static final String CONTENT_URI_BASE = "content://" + AUTHORITY + "/";

    public static final Uri FOLDERS_CONTENT_URI = Uri.parse(CONTENT_URI_BASE + FOLDERS_BASE_PATH);
    public static final Uri TRACKS_CONTENT_URI = Uri.parse(CONTENT_URI_BASE + TRACKS_BASE_PATH);

    static
    {
        sURIMatcher.addURI(AUTHORITY, FOLDERS_BASE_PATH, FOLDERS);
        sURIMatcher.addURI(AUTHORITY, FOLDERS_BASE_PATH + "/#", FOLDER_ID);
        sURIMatcher.addURI(AUTHORITY, TRACKS_BASE_PATH, TRACKS);
        sURIMatcher.addURI(AUTHORITY, TRACKS_BASE_PATH + "/#", TRACK_ID);
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder)
    {
        SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();

        int uriType = sURIMatcher.match(uri);
        switch (uriType)
        {
            case FOLDERS:
                queryBuilder.setTables(getTablesForFolders());
                break;

            case FOLDER_ID:
                queryBuilder.setTables(FolderTable.TABLE_NAME);
                queryBuilder.appendWhere(FolderTable.COLUMN_ID + "=" + uri.getLastPathSegment());
                break;

            case TRACKS:
                queryBuilder.setTables(getTablesForTracks());
                break;

            case TRACK_ID:
                queryBuilder.setTables(TrackTable.TABLE_NAME);
                queryBuilder.appendWhere(TrackTable.COLUMN_ID + "=" + uri.getLastPathSegment());
                break;

        default:
                throw new IllegalArgumentException("Unknown URI: " + uri);
        }

        SQLiteDatabase db = m_helper.getWritableDatabase();
        if (db == null)
            return null;

        Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder);
        if (cursor == null)
            return null;

        setNotificationUri(cursor, uri);

        return cursor;
    }    
    // ....
}

使用不同的類來實現ContentProvider和DatabaseHelper。 看到的示例與您的示例完全不同,但是您會通過看到它而獲得想法。

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper{

private static final String name="mybooks.sdb";
private static final int version=1;
private static final CursorFactory factory=null;
public DatabaseHelper(Context context)
{
    super(context,name,factory,version);
}
@Override
public void onCreate(SQLiteDatabase database) {
    // TODO Auto-generated method stub
    database.execSQL("create table mybooks(code INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,author TEXT)");
}

@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
    // TODO Auto-generated method stub

}
public long insert(ContentValues contentValues)
{
    long x;
    SQLiteDatabase database=this.getWritableDatabase();
    x=database.insert("mybooks",null, contentValues);
    database.close();
    return x;
}
public Cursor query(String[] columns,String whereClause,String[] replaceQuestionMarksWith,String orderBy)
{
    SQLiteDatabase database=this.getReadableDatabase();
    return database.query("mybooks", columns, whereClause, replaceQuestionMarksWith, null, null, orderBy);
}
public int update(ContentValues contentValues,String whereClause,String[] replaceQuestionMarksWith)
{
    SQLiteDatabase database=this.getWritableDatabase();
    int numberOfRecordsUpdated=database.update("mybooks", contentValues, whereClause, replaceQuestionMarksWith);
    database.close();
    return numberOfRecordsUpdated;
}
public int delete(String whereClause,String[] replaceQuestionMarksWith)
{
    SQLiteDatabase database=this.getWritableDatabase();
    int numberOfRecordsDeleted=database.delete("mybooks", whereClause, replaceQuestionMarksWith);
    database.close();
    return numberOfRecordsDeleted;
}

}

和ContentProvider.java作為

    public class MyBookProvider extends ContentProvider{
    private DatabaseHelper databaseHelper;
    private static final UriMatcher uriMatcher;
    private static final int INCOMING_BOOK_COLLECTION_URI_INDICATOR = 1;
    private static final int INCOMING_ONE_BOOK_URI_INDICATOR = 2;

    static {
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);               
        uriMatcher.addURI(LibraryContentProviderMetaData.AUTHORITY, "books",INCOMING_BOOK_COLLECTION_URI_INDICATOR);        
        uriMatcher.addURI(LibraryContentProviderMetaData.AUTHORITY, "books/#",INCOMING_ONE_BOOK_URI_INDICATOR); 
    }
@Override
    public String getType(Uri uri) 
    {
        String mimeType;
        switch(uriMatcher.match(uri))
        {
            case INCOMING_BOOK_COLLECTION_URI_INDICATOR:
                mimeType=LibraryContentProviderMetaData.CONTENT_TYPE;
                break;
            case INCOMING_ONE_BOOK_URI_INDICATOR:
                mimeType=LibraryContentProviderMetaData.CONTENT_ITEM_TYPE;
                break;
            default:throw new IllegalArgumentException("Invalid URI"+uri);
        }
        return mimeType;
    }
@Override
    public Uri insert(Uri uri, ContentValues contentValues) {
        // TODO Auto-generated method stub
        if (uriMatcher.match(uri) != INCOMING_BOOK_COLLECTION_URI_INDICATOR) 
        {
            throw new IllegalArgumentException("Invalid URI " + uri);
        }
        long x = databaseHelper.insert(contentValues);
        return Uri.parse("content//com.lib.mybooks.MyBookProvider/books/" + x);
    }
    @Override
    public boolean onCreate() {     
        databaseHelper = new DatabaseHelper(getContext());
        return true;
    }
    @Override
    public Cursor query(Uri uri, String[] columns, String whereClause,String[] replaceQuestionMarksWith, String orderBy) 
    {
        switch (uriMatcher.match(uri)) 
        {
        case INCOMING_BOOK_COLLECTION_URI_INDICATOR:break;
        case INCOMING_ONE_BOOK_URI_INDICATOR:whereClause = "code=?";
            replaceQuestionMarksWith = new String[] { uri.getPathSegments().get(1) };
            break;
        default:throw new IllegalArgumentException("Invalid URI " + uri);
        }
        Cursor cursor = databaseHelper.query(columns, whereClause,replaceQuestionMarksWith, orderBy);
        return cursor;
    }
    @Override
    public int update(Uri uri, ContentValues contentValues, String whereClause, String[] replaceQuestionMarksWith) 
    {
        if(uriMatcher.match(uri)!=INCOMING_BOOK_COLLECTION_URI_INDICATOR)
        {
            throw new IllegalArgumentException("Invalid URI "+uri);
        }

        return databaseHelper.update(contentValues, whereClause,replaceQuestionMarksWith);
    }
    @Override
    public int delete(Uri uri, String whereClause, String[] replaceQuestionMarksWith) 
    {
        if(uriMatcher.match(uri)!=INCOMING_BOOK_COLLECTION_URI_INDICATOR)
        {
            throw new IllegalArgumentException("Invalid URI "+uri);
        }
        return databaseHelper.delete(whereClause, replaceQuestionMarksWith);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM