SQLite Android内容提供程序更新特定列

SQLite Android内容提供程序更新特定列

在本文中,我们将介绍如何在Android应用程序中使用SQLite内容提供程序来更新特定列的数据。SQLite是一个轻量级的嵌入式数据库,广泛用于Android开发中存储和管理数据。内容提供程序是Android平台中一种常见的数据访问模式,它为应用程序提供了一种统一的方式来管理数据,包括对数据库的增删改查操作。

阅读更多:SQLite 教程

使用SQLiteOpenHelper创建数据库和表

在使用SQLite内容提供程序之前,我们需要创建一个数据库和表来存储我们的数据。可以通过继承SQLiteOpenHelper类来实现这一点。例如,我们将创建一个名为”Student”的表,其中包含”Name”和”Age”两列:

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "student.db";
    private static final int DATABASE_VERSION = 1;

    private static final String TABLE_NAME = "Student";
    private static final String COLUMN_NAME = "Name";
    private static final String COLUMN_AGE = "Age";

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTableQuery = "CREATE TABLE " + TABLE_NAME +
                                  " (_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                                  COLUMN_NAME + " TEXT, " +
                                  COLUMN_AGE + " INTEGER);";
        db.execSQL(createTableQuery);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 数据库升级逻辑
    }
}

创建内容提供程序类

接下来,我们需要创建一个继承自ContentProvider的类来定义和管理我们的内容提供程序。在这个类中,我们将实现增删改查操作,并提供URI来访问数据库中的特定数据。以下是一个示例:

public class StudentProvider extends ContentProvider {
    private static final String AUTHORITY = "com.example.provider.student";
    private static final String PATH = "Student";
    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + PATH);

    private static final int STUDENT = 100;
    private static final int STUDENT_ID = 101;

    private DatabaseHelper databaseHelper;

    @Override
    public boolean onCreate() {
        databaseHelper = 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) {
        SQLiteDatabase database = databaseHelper.getReadableDatabase();
        Cursor cursor = null;

        int match = sUriMatcher.match(uri);
        switch (match) {
            case STUDENT:
                cursor = database.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
                break;
            case STUDENT_ID:
                selection = COLUMN_NAME + "=?";
                selectionArgs = new String[]{uri.getLastPathSegment()};
                cursor = database.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
                break;
            default:
                throw new IllegalArgumentException("Unknown URI: " + uri);
        }

        if (cursor != null) {
            cursor.setNotificationUri(getContext().getContentResolver(), uri);
        }

        return cursor;
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        int match = sUriMatcher.match(uri);
        switch (match) {
            case STUDENT:
                return CONTENT_LIST_TYPE;
            case STUDENT_ID:
                return CONTENT_ITEM_TYPE;
            default:
                throw new IllegalStateException("Unknown URI: " + uri + " with match " + match);
        }
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        SQLiteDatabase database = databaseHelper.getWritableDatabase();

        long id = database.insert(TABLE_NAME, null, values);
        if (id == -1) {
            Log.e(TAG, "Insertion failed for URI: " + uri);
            return null;
        }

        getContext().getContentResolver().notifyChange(uri, null);

        return ContentUris.withAppendedId(CONTENT_URI, id);
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection,
                      @Nullable String[] selectionArgs) {
        SQLiteDatabase database = databaseHelper.getWritableDatabase();

        int rowsUpdated;
        int match = sUriMatcher.match(uri);
        switch (match) {
            case STUDENT:
                rowsUpdated = database.update(TABLE_NAME, values, selection, selectionArgs);
                break;
            case STUDENT_ID:
                selection = COLUMN_NAME + "=?";
                selectionArgs = new String[]{uri.getLastPathSegment()};
                rowsUpdated = database.update(TABLE_NAME, values, selection, selectionArgs);
                break;
            default:
                throw new IllegalArgumentException("Update is not supported for: " + uri);
        }

        if (rowsUpdated != 0) {
            getContext().getContentResolver().notifyChange(uri, null);
        }

        return rowsUpdated;
    }

    // 其他方法:删除数据等

}

在上面的代码中,我们重写了ContentProvider的query()方法和update()方法来实现查询和更新特定列的功能。在update()方法中,我们首先根据传入的URI判断操作的是整个表还是特定行,然后使用selection和selectionArgs来过滤要更新的行。

更新特定列的数据

接下来,我们可以在应用程序的其他地方使用内容提供程序来更新特定列的数据。例如,我们可以使用ContentResolver来更新名为”John”的学生的年龄:

ContentValues values = new ContentValues();
values.put(COLUMN_AGE, 25);

String selection = COLUMN_NAME + "=?";
String[] selectionArgs = new String[]{"John"};

getContentResolver().update(CONTENT_URI, values, selection, selectionArgs);

上面的代码将”John”的年龄更新为25岁。我们使用ContentValues对象来设置要更新的列和新的值,然后使用selection和selectionArgs来指定要更新的行。

总结

在本文中,我们介绍了如何在Android应用程序中使用SQLite内容提供程序来更新特定列的数据。我们首先创建了一个DatabaseHelper类来管理数据库和表,然后创建了一个继承自ContentProvider的类来实现增删改查操作。最后,我们展示了如何使用内容提供程序来更新特定列的数据。通过使用SQLite内容提供程序,我们可以轻松地管理和更新我们的数据,提高应用程序的数据访问效率。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程