设计两个记事本app,通过ContentProvider,实现对另一组的记事本数据表中的数据进行增删改查,需要完整的代码
时间: 2024-03-01 13:52:13 浏览: 32
好的,我可以提供一个简单的示例代码,来演示如何通过ContentProvider实现两个记事本app之间的数据共享。请注意,由于篇幅限制,这里只提供代码框架,具体实现细节还需要按照实际需求进行调整。
首先,我们需要在“记事本B”中创建一个ContentProvider,代码如下:
```java
public class NoteProvider extends ContentProvider {
// 定义ContentProvider的URI
public static final Uri CONTENT_URI = Uri.parse("content://com.example.noteprovider");
// 定义数据库相关的常量
private static final String DATABASE_NAME = "notes.db";
private static final int DATABASE_VERSION = 1;
private static final String NOTES_TABLE_NAME = "notes";
private static final String NOTES_TABLE_CREATE =
"CREATE TABLE " + NOTES_TABLE_NAME + " (" +
"_id INTEGER PRIMARY KEY," +
"title TEXT NOT NULL," +
"content TEXT NOT NULL," +
"created_at INTEGER" +
");";
// 定义SQLiteOpenHelper对象
private DatabaseHelper mOpenHelper;
// 定义数据库操作相关的常量
private static final int NOTES = 1;
private static final int NOTES_ID = 2;
private static final UriMatcher sUriMatcher;
static {
sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sUriMatcher.addURI("com.example.noteprovider", "notes", NOTES);
sUriMatcher.addURI("com.example.noteprovider", "notes/#", NOTES_ID);
}
// 实现ContentProvider的方法
@Override
public boolean onCreate() {
mOpenHelper = new DatabaseHelper(getContext());
return true;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,
@Nullable String[] selectionArgs, @Nullable String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(NOTES_TABLE_NAME);
switch (sUriMatcher.match(uri)) {
case NOTES:
break;
case NOTES_ID:
qb.appendWhere("_id=" + uri.getLastPathSegment());
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
Cursor cursor = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder);
// 注册ContentObserver,用于数据变化通知
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
switch (sUriMatcher.match(uri)) {
case NOTES:
return "vnd.android.cursor.dir/vnd.example.notes";
case NOTES_ID:
return "vnd.android.cursor.item/vnd.example.notes";
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
long rowId = db.insert(NOTES_TABLE_NAME, null, values);
if (rowId > 0) {
Uri noteUri = ContentUris.withAppendedId(CONTENT_URI, rowId);
getContext().getContentResolver().notifyChange(noteUri, null);
return noteUri;
}
throw new SQLException("Failed to insert row into " + uri);
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
int count;
switch (sUriMatcher.match(uri)) {
case NOTES:
count = db.delete(NOTES_TABLE_NAME, selection, selectionArgs);
break;
case NOTES_ID:
String noteId = uri.getPathSegments().get(1);
count = db.delete(NOTES_TABLE_NAME, "_id=" + noteId +
(!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""), selectionArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection,
@Nullable String[] selectionArgs) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
int count;
switch (sUriMatcher.match(uri)) {
case NOTES:
count = db.update(NOTES_TABLE_NAME, values, selection, selectionArgs);
break;
case NOTES_ID:
String noteId = uri.getPathSegments().get(1);
count = db.update(NOTES_TABLE_NAME, values, "_id=" + noteId +
(!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""), selectionArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
// 定义SQLiteOpenHelper类
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(NOTES_TABLE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + NOTES_TABLE_NAME);
onCreate(db);
}
}
}
```
上述代码中,我们首先定义了ContentProvider的URI,然后定义了数据库相关的常量,包括数据库名称、数据库版本、数据表名称、数据表结构等等。接着,我们定义了一个SQLiteOpenHelper对象,用来创建和管理数据库。然后,我们实现了ContentProvider的各种方法,包括query、insert、delete、update等等。在这些方法中,我们使用ContentResolver来访问数据库,从而实现对数据的操作。最后,我们定义了一个DatabaseHelper类,用来辅助创建和管理数据库。
接下来,我们需要在“记事本A”中使用ContentResolver来访问“记事本B”中的数据。代码如下:
```java
public class MainActivity extends AppCompatActivity {
// 定义ContentProvider的URI
private static final Uri CONTENT_URI = Uri.parse("content://com.example.noteprovider/notes");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 查询数据
Cursor cursor = getContentResolver().query(CONTENT_URI, null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
do {
String title = cursor.getString(cursor.getColumnIndex("title"));
String content = cursor.getString(cursor.getColumnIndex("content"));
long createdAt = cursor.getLong(cursor.getColumnIndex("created_at"));
// TODO: 处理数据
} while (cursor.moveToNext());
cursor.close();
}
// 插入数据
ContentValues values = new ContentValues();
values.put("title", "新建笔记");
values.put("content", "这是一篇新建的笔记");
values.put("created_at", System.currentTimeMillis());
Uri uri = getContentResolver().insert(CONTENT_URI, values);
// 更新数据
values.put("title", "修改后的笔记");
getContentResolver().update(uri, values, null, null);
// 删除数据
getContentResolver().delete(uri, null, null);
}
}
```
上述代码中,我们首先定义了ContentProvider的URI,然后使用ContentResolver来查询“记事本B”中的数据。查询的结果是一个Cursor对象,我们可以通过遍历Cursor来获取每一条数据的信息。接着,我们使用ContentResolver来插入一条新的数据,并获取插入数据的URI。然后,我们使用ContentResolver来更新数据和删除数据。
这样,我们就完成了通过ContentProvider实现两个记事本app之间的数据共享的示例代码。请注意,具体实现细节还需要按照实际需求进行调整。