0

Я пытаюсь обновить ListView, используя Content Provider. Я создал свой провайдер и попытался связать его propelry с моей SqlLite DB. Как только у меня будет установлен мой провайдер, я реализую свой контроллер-манипулятор, но мне нужна помощь с моим провайдером. Я не нашел и подробную информацию для начинающих пользователей о том, как создать поставщика контента. Любая помощь будет оценена. Моя БД и Провайдер размещены ниже. Моя основная проблема заключается в создании URI, который ссылается на мою БД.Sqlite_Content Provider assistant

DB:

public class dataStore extends SQLiteOpenHelper { 

//Table attributes 
public static final String DATABASE_NAME = "SiteLogindb"; 
public static final int DATABASE_VERSION = 2; 
public static final String TABLE_NAME_INFOTABLE = "infoTable"; 

// Data attributes 
public static final String COLUMN_NAME_SITE = "sName"; 
public static final String COLUMN_NAME_ADDRESS = "wUrl"; 
public static final String COLUMN_NAME_USERNAME = "uName"; 
public static final String COLUMN_NAME_PASSWORD = "pWord"; 
public static final String COLUMN_NAME_NOTES = "lNotes"; 



public dataStore(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     // TODO Auto-generated constructor stub 
    } 


    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 

     String sqlDataStore = "create table if not exists " + 
     TABLE_NAME_INFOTABLE + " ("+ BaseColumns._ID + " integer primary key autoincrement," 

        + COLUMN_NAME_SITE + " text not null," 
        + COLUMN_NAME_ADDRESS + " text not null," 
        + COLUMN_NAME_USERNAME + " text not null," 
        + COLUMN_NAME_PASSWORD + " text not null," 
        + COLUMN_NAME_NOTES + " text not null);"; 

     db.execSQL(sqlDataStore); 
    } 


    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     if(oldVersion == 1 && newVersion == 2){ 
      //Upgrade the database 

    } 

     } 
      } 

Content Provider:

  public class ListProvider extends ContentProvider { 
private dataStore lDB; 

private static final String AUTHORITY = "com.loginplus.home.ListProvider"; 
public static final int TUTORIALS = 1; 
public static final int TUTORIAL_ID = 2; 
private static final String TUTORIALS_BASE_PATH = "tutorials"; 
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY 
     + "/" + TUTORIALS_BASE_PATH); 
public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE 
     + "/mt-tutorial"; 
public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE 
     + "/mt-tutorial"; 

@Override 
public boolean onCreate() { 
    lDB = new dataStore(getContext()); 
    return true; 
} 

private static final UriMatcher sURIMatcher = new UriMatcher(
     UriMatcher.NO_MATCH); 
static { 
    sURIMatcher.addURI(AUTHORITY, TUTORIALS_BASE_PATH, TUTORIALS); 
    sURIMatcher.addURI(AUTHORITY, TUTORIALS_BASE_PATH + "/#", TUTORIAL_ID); 
} 

@Override 
public Cursor query(Uri uri, String[] projection, String selection, 
     String[] selectionArgs, String sortOrder) { 
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 
    queryBuilder.setTables(dataStore.TABLE_NAME_INFOTABLE); 
    int uriType = sURIMatcher.match(uri); 
    switch (uriType) { 
    case TUTORIAL_ID: 
     queryBuilder.appendWhere(dataStore.DATABASE_VERSION + "=" 
       + uri.getLastPathSegment()); 
     break; 
    case TUTORIALS: 
     // no filter 
     break; 
    default: 
     throw new IllegalArgumentException("Unknown URI"); 
    } 
    Cursor cursor = queryBuilder.query(lDB.getReadableDatabase(), 
      projection, selection, selectionArgs, null, null, sortOrder); 
    cursor.setNotificationUri(getContext().getContentResolver(), uri); 
    return cursor; 
} 
//Deleting DB entries 
@Override 
public int delete(Uri uri, String selection, String[] selectionArgs) { 
    int uriType = sURIMatcher.match(uri); 
    SQLiteDatabase sqlDB = lDB.getWritableDatabase(); 
    int rowsAffected = 0; 
    switch (uriType) { 
    case TUTORIALS: 
     rowsAffected = sqlDB.delete(dataStore.TABLE_NAME_INFOTABLE, 
       selection, selectionArgs); 
     break; 
    case TUTORIAL_ID: 
     String id = uri.getLastPathSegment(); 
     if (TextUtils.isEmpty(selection)) { 
      rowsAffected = sqlDB.delete(dataStore.TABLE_NAME_INFOTABLE, 
        BaseColums.ID + "=" + id, null); 
     } else { 
      rowsAffected = sqlDB.delete(dataStore.TABLE_NAME_INFOTABLE, 
        selection + " and " + BaseColums.ID + "=" + id, 
        selectionArgs); 
     } 
     break; 
    default: 
     throw new IllegalArgumentException("Unknown or Invalid URI " + uri); 
    } 
    getContext().getContentResolver().notifyChange(uri, null); 
    return rowsAffected; 
} 
@Override 
public String getType(Uri uri) { 
    // TODO Auto-generated method stub 
    return null; 
} 
//Inserting DB entries 
@Override 
public Uri insert(Uri uri, ContentValues values) { 
    // TODO Auto-generated method stub 
      return null; 
} 
//updating DB entries 
@Override 
public int update(Uri uri, ContentValues values, String selection, 
     String[] selectionArgs) { 
    int uriType = sURIMatcher.match(uri); 
    SQLiteDatabase sqlDB = lDB.getWritableDatabase(); 
    int rowsAffected = 0; 
    switch (uriType) { 
    case TUTORIALS: 
     rowsAffected = sqlDB.update(dataStore.TABLE_NAME_INFOTABLE, 
       null, selection, selectionArgs); 
     break; 
    case TUTORIAL_ID: 
     String id = uri.getLastPathSegment(); 
     if (TextUtils.isEmpty(selection)) { 
      rowsAffected = sqlDB.update(dataStore.TABLE_NAME_INFOTABLE, 
        null, BaseColums.ID + "=" + id, null); 
     } else { 
      rowsAffected = sqlDB.update(dataStore.TABLE_NAME_INFOTABLE, 
        null, selection + " and " + BaseColums.ID + "=" + id, 
        selectionArgs); 
     } 
     break; 
    default: 
     throw new IllegalArgumentException("Unknown or Invalid URI " + uri); 
    } 
    getContext().getContentResolver().notifyChange(uri, null); 
    return rowsAffected; 
} 
    } 

ответ

0

Моя главная проблема пытается создать URI, ссылки на моей БД.

  • Сейчас ваш ListProvider.CONTENT_URI будет соответствовать в вашем ListProvider с помощью UriMatcher. И ваш ListProvider использует ваш dataStore.TABLE_NAME_INFOTABLE, который является единственной таблицей в вашей базе данных.

  • Таким образом, вы уже можете использовать ContentProvider непосредственно с помощью ContentResolver в вашем Activity с кодом, как это:

    getContentResolver().query(ListProvider.CONTENT_URI, projection, selection, selectionArgs, sortOrder); 
    getContentResolver().delete(ListProvider.CONTENT_URI, where, selectionArgs); 
    //etc... 
    

После того, как я закончил мой провайдер я реализую мой cursorloader, но 1st мне нужна помощь с моим провайдером.

  • Ваш ContentProvider, кажется, сделано. Однако вы должны помнить, чтобы добавить его в свой манифест с тем же AUTHORITY. Вы можете переименовать авторитет, но он должен быть уникальным и соответствовать вашему «ContentProvider» и вашему манифесту.

    <provider 
        android:name="com.loginplus.home.ListProvider" 
        android:authorities="com.loginplus.home.ListProvider" > 
    </provider> 
    
  • Вы тогда сможете создать свой CursorLoader в public Loader<Cursor> onCreateLoader(int id, Bundle args) обратного вызова.

    CursorLoader cursorLoader = new CursorLoader(this, ListProvider.CONTENT_URI, projection, selection, selectionArgs, orderBy); 
    

я не нашел и подробную информацию для начинающих пользователей о том, как создать контент-провайдер. Любая помощь будет оценена.

  • Ларс Vogella имеет большое tutorial, который проведет вас через создание собственной SQLite database, ContentProvider и CursorLoader. Это помогло мне начать и дать отличную основу.
Смежные вопросы