Android-ContentResolver取巧执行原生SQL语句(rawQuery/execSQL)

本文介绍了一种让ContentProvider支持执行原生SQL语句的方法。通过自定义ContentProvider并添加rawQuery和execSQL方法,可以方便地实现数据库迁移及跨应用共享访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.困境

众所周知ContentProvider没有执行原生SQL的方法,只有增删改查四个固定方法和固定参数,
因此ContentResolver也只有四个固定方法与之对应。
现在需求是要把某个app的数据库迁移到另一个app,然后通过ContentProvider共享访问,
这就非常麻烦了,原来的项目所有SQL语句都要重新拆开改写成ContentResolver的四个固定方法...
非常浪费时间,太无聊了,纠结了很久。。。
想到了一个取巧方法:自定义ContentProvider添加rawQuery/execSQL方法,直接执行原生SQL语句。

二.取巧方法

// 1.在ContentProvider.query()中自定义rawQuery和execSQL方法
public class DBContentProvider extends ContentProvider {
    private static SQLiteOpenHelper mHelper;

    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,
                        @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        SQLiteDatabase db = mHelper.getReadableDatabase();
        switch(sortOrder){
            case "rawQuery": //查询SQL
                return db.rawQuery(selection, null);
                break;
            case "execSQL": //增删改SQL
                db.execSQL(selection);
                break;          
        }        
        return null;
    }

    /*
    @Override
    public Bundle call(@NonNull String method, @Nullable String arg, @Nullable Bundle extras) {
        switch (method) {
            case "execSQL":
                mHelper.getWritableDatabase().execSQL(arg);
                break;
        }
        return super.call(method, arg, extras);
    }
    */
}

// 2.对ContentResolver增加rawQuery和execSQL方法,直接执行原生SQL语句
public class MyContentResolver {
    private static final Uri URI = Uri.parse("content://xxx");

    public static Cursor rawQuery(Context cxt, String sql) {
        try {
            return cxt.getContentResolver().query(URI, null, sql, null, "rawQuery");
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void execSQL(Context cxt, String sql) {
        try {
            cxt.getContentResolver().query(URI, null, sql, null, "execSQL");
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
}

简书: https://www.jianshu.com/p/a92efa1c52b7
优快云: https://blog.youkuaiyun.com/qq_32115439/article/details/80072859
GitHub博客: http://lioil.win/2018/04/24/Android_ContentResolver_rawQuery.html
Coding博客: http://c.lioil.win/2018/04/24/Android_ContentResolver_rawQuery.html

### 回答1: Android Studio中使用SQL语句进行数据更新的语法如下: ```java UPDATE table_name SET column1=value1,column2=value2,... WHERE some_column=some_value; ``` 其中,table_name为要更新的数据表名称,column1、column2为要更新的列名,value1、value2为对应列要更新的值。 `WHERE`子句用于指定要更新的数据行,可以使用多个条件进行过滤。`some_column`和`some_value`表示要过滤的列名和对应的值。 例如,更新名为`students`的表中`id`为`1`的学生的年龄和性别,可以使用以下语句: ```java UPDATE students SET age=20,gender='男' WHERE id=1; ``` 注意:在使用更新语句时,请务必注意数据的安全性和合法性,避免出现数据错误或安全问题。 ### 回答2: 在Android Studio中,可以使用SQL语言来执行数据库的更新操作。更新语句通常使用"UPDATE"关键字,并指定要更新的表名、要更新的字段和对应的值,以及一个可选的WHERE条件进行筛选。以下是一个示例: ```java String sql = "UPDATE 表名 SET 字段1 = 值1, 字段2 = 值2 WHERE 条件"; ``` 其中,"表名"是要更新的数据库表的名称,"字段1"、"字段2"是要更新的字段名,"值1"、"值2"是对应的新值,"条件"是可选的筛选条件,用于指定哪些记录需要进行更新。可以根据具体需求进行灵活组合,例如可以只更新特定条件下的记录,或者更新多个字段的值。 在使用Android Studio进行数据库操作时,可以通过执行"execSQL()"方法来执行更新语句,例如: ```java SQLiteDatabase db = dbHelper.getWritableDatabase(); // 获取可写的数据库对象 String sql = "UPDATE 表名 SET 字段 = 值 WHERE 条件"; db.execSQL(sql); // 执行更新操作 ``` 需要注意的是,在执行更新操作之前,需要先获取一个可写的数据库对象,可以通过SQLiteOpenHelper类中的getWritableDatabase()方法来获取。同时,为了防止数据库操作过程中发生异常,应该进行异常处理,例如使用try-catch语句来捕获可能的异常。 ### 回答3: 在Android Studio中,执行SQL更新语句的方式有两种:使用execSQL()方法和使用ContentResolver类的update()方法。 1. 使用execSQL()方法 execSQL()方法是SQLiteOpenHelper类的一个方法,用于执行SQL语句。使用execSQL()方法执行SQL更新语句的一般步骤如下: 1) 获取数据库的可写连接:如, SQLiteDatabase db = getWritableDatabase(); 2) 定义SQL更新语句,例如: String sql = "UPDATE 表名 SET 列名1 = 新值1, 列名2 = 新值2 WHERE 条件"; 3) 执行SQL更新语句,例如: db.execSQL(sql); 4) 关闭数据库连接:如, db.close(); 2. 使用ContentResolver类的update()方法 ContentResolver类是Android提供的用于与ContentProvider通信的类。对于由ContentProvider提供的数据,在Android Studio中可以使用ContentResolver类的update()方法来执行SQL更新语句。使用ContentResolver执行SQL更新语句的一般步骤如下: 1) 获取ContentResolver对象:如, ContentResolver resolver = getContentResolver(); 2) 定义URI:URI用于指定要更新的内容提供者和数据表,例如: Uri uri = Uri.parse("content://authority/表名"); 3) 定义更新的数据:使用ContentValues对象来存储要更新的数据,例如: ContentValues values = new ContentValues(); values.put("列名1", 新值1); values.put("列名2", 新值2); 4) 执行SQL更新语句,例如: int rows = resolver.update(uri, values, "条件", null); 5) 根据返回值rows判断更新是否成功。 以上就是在Android Studio中执行SQL更新语句的两种常见方式。根据具体的场景和需要选择合适的方法来更新数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值