Android--SQLite事务

本文介绍了在Android中如何利用SQLite进行事务处理,强调事务在批量操作中的重要性,以提高数据库操作的效率和安全性。通过示例展示了如何在MainActivity.java中开启和提交事务,以及事务在防止错误影响数据库时的作用。

这次我们来谈谈如何在 Android 中使用 SQLite 的事务,如果对 SQLite 事务不了解的朋友可以看看我的博客SQLite 高级语法介绍

有了解 SQLite 事务的朋友都知道事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有数据修改均被清除。

事务使用,可以提供一个机制,防止在执行过程中出错而之前正确的sql有影响了数据库的情况出现。所以这对我们对数据库做批量操作是很有用的,如果我们不设置事务,每一条 SQL 语句的执行都会默认开启一个事务,这影响了我们的效率。

使用事务并不是很复杂:

beginTransaction() //开启事务
setTransactionSuccessful()  //设置提交事务
endTransaction()  //关闭事务

我们需要 MySqliteHelper 和 Constant 这两个类,用来创建数据库。

MySQLiteHelper.java:

public class MySqliteHelper extends SQLiteOpenHelper {

    public MySqliteHelper(Context context) {
        super(context, Constant.DATABASE_NAME, null, Constant.DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.i("TAG", "-------onCreate--------");
        String sql = "create table " + Constant.TABLE_NAME + " (" +
                Constant._ID + " Integer primary key, " +
                Constant.NAME + " varchar(10)," +
                Constant.AGE + " Integer)";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.i("TAG", "-------onUpGrade-------");
    }

    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
        Log.i("TAG", "-------onOpen-------");
    }
}

Constant.java:

public class Constant {
    public static final String DATABASE_NAME = "info.db"; //数据库名称
    public static final int DATABASE_VERSION = 1; //数据库版本
    public static final String TABLE_NAME = "person"; //表名
    public static final String _ID = "_id";
    public static final String NAME = "name";
    public static final String AGE = "age";
}

对这两个类不理解的可以看我的博客Android上SQLite的基本应用(一)

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.ht.sqlitetransation.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="批量插入"
        android:onClick="insertData"/>
</RelativeLayout>

这里就用一个 Button, 点击 Button 就批量添加数据。

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    private MySqliteHelper helper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        helper = new MySqliteHelper(this);
    }

    public void insertData(View view) {
        SQLiteDatabase db = helper.getWritableDatabase();
        //1.数据库显示开启事务
        db.beginTransaction();
        for (int i = 1; i <= 100; i++) {
            StringBuilder sqlBuilder = new StringBuilder();
            sqlBuilder.append("insert into ");
            sqlBuilder.append(Constant.TABLE_NAME);
            sqlBuilder.append(" values(");
            sqlBuilder.append(i);
            sqlBuilder.append(", '李四");
            sqlBuilder.append(i);
            sqlBuilder.append("', 18)");
            db.execSQL(sqlBuilder.toString());
        }
        //2.提交当前事务
        db.setTransactionSuccessful();
        //3.关闭事务
        db.endTransaction();
        db.close();
    }
}

事务的使用是既简单又方便的,如果我们要批量操作,希望大家都能使用事务来做。

结束语:本文仅用来学习记录,参考查阅。

<think>好的,我现在需要帮助用户了解如何在UniApp-X中集成和使用SQLite数据库。首先,我需要回顾一下用户提供的引用内容,看看已有的信息有哪些。根据引用[1],用户已经知道uni-app的基本概念,并且提到了创建uni-app项目和SQLite作为本地数据库的使用。引用[2]详细介绍了SQLite的特点和集成方法,包括安装插件、初始化数据库、增删改查操作。引用[3]则涉及uni-ui和底部导航的实现,可能与当前问题关联不大,但可能涉及到项目结构方面的内容。 首先,用户的需求是希望在UniApp-X中使用SQLite,所以需要确认UniApp-X是否支持SQLite。根据之前的引用,uni-app可以通过插件集成SQLite,比如引用[2]提到的uni-app-sqlite插件。但需要确认UniApp-X是否有类似的插件或者是否有不同的方法。由于UniApp-X是uni-app的新版本或扩展,可能需要查阅最新的文档来确认兼容性。假设UniApp-X仍然支持相同的插件机制,那么步骤可能与引用[2]中的类似。 接下来,我需要整理集成SQLite的具体步骤。根据引用[2],步骤包括安装SQLite插件、初始化数据库、创建表、执行CRUD操作。这些步骤需要适配到UniApp-X的项目结构中。此外,用户可能需要示例代码,所以需要提供一个简单的示例,比如创建数据库、创建表、插入数据、查询数据等。 另外,用户可能遇到的一些常见问题需要注意,比如数据库路径问题、异步操作的处理、错误处理等。引用[2]中提到了使用executeSql方法执行SQL语句,这需要在示例中正确展示。同时,需要注意SQLite在移动端的兼容性,比如Android和iOS的不同表现,但uni-app的插件通常已经处理了这些差异。 还需要考虑UniApp-X的特性和语法是否与标准uni-app有所不同,比如组件的使用、API的调用方式等。如果有变化,可能需要调整代码示例。例如,UniApp-X可能使用不同的语法或生命周期钩子,需要确保示例代码符合其规范。 最后,生成相关问题时要围绕SQLite在UniApp-X中的应用,可能涉及性能优化、数据同步、复杂查询、调试方法和数据加密等方面。这些问题可以帮助用户进一步深入学习和解决问题。 总结步骤: 1. 创建UniApp-X项目,确保环境配置正确。 2. 安装SQLite插件(如存在兼容问题需处理)。 3. 初始化数据库,确认路径和名称。 4. 创建表结构,使用executeSql执行CREATE语句。 5. 实现增删改查操作,处理异步结果和错误。 6. 提供示例代码,展示完整流程。 7. 提示注意事项,如路径处理、异步操作、错误处理。 8. 生成相关问题,帮助用户扩展知识。 现在需要验证这些步骤是否正确,并确保示例代码在UniApp-X中可行。如果有不确定的地方,可能需要查阅最新的UniApp-X文档或社区资源,确保信息的准确性。</think>### 在UniApp-X中集成SQLite的完整教程 #### 1. 创建UniApp-X项目 通过HBuilderX创建新项目,选择`uni-app-x`模板。项目结构需包含`manifest.json`配置文件,用于声明数据库插件[^1]。 #### 2. 安装SQLite插件 在HBuilderX插件市场中搜索`sqlite`相关插件(如`uni-app-sqlite`),点击安装。安装后需在`manifest.json`的`App插件配置`中添加SQLite支持[^2]。 #### 3. 初始化数据库 在页面逻辑中引入SQLite模块并初始化数据库: ```javascript // pages/index/index.ux import sqlite from '@uni/sqlite'; const db = sqlite.openDatabase({ name: 'test.db', location: 'default' }); ``` #### 4. 创建数据表 通过`executeSql`方法执行建表语句: ```javascript db.transaction(tx => { tx.executeSql( 'CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)', [], () => console.log('Table created'), (err) => console.error('Error:', err) ); }); ``` #### 5. 增删改查操作示例 **插入数据**: ```javascript tx.executeSql( 'INSERT INTO users (name, age) VALUES (?, ?)', ['张三', 25], () => console.log('Insert success'), (err) => console.error('Insert failed:', err) ); ``` **查询数据**: ```javascript tx.executeSql( 'SELECT * FROM users', [], (_, result) => { for (let i = 0; i < result.rows.length; i++) { console.log(result.rows.item(i)); } }, (err) => console.error('Query failed:', err) ); ``` #### 6. 完整页面示例 ```javascript // pages/database/database.ux import sqlite from '@uni/sqlite'; export default { onReady() { const db = sqlite.openDatabase({ name: 'demo.db' }); db.transaction(tx => { // 建表 tx.executeSql( 'CREATE TABLE IF NOT EXISTS books(id INTEGER PRIMARY KEY, title TEXT)' ); // 插入 tx.executeSql('INSERT INTO books (title) VALUES ("UniApp-X指南")'); // 查询 tx.executeSql( 'SELECT * FROM books', [], (_, results) => console.log(JSON.stringify(results.rows)) ); }, (error) => console.error('Transaction error:', error), () => console.log('Transaction completed')); } } ``` #### 7. 注意事项 - **路径规范**:iOS/Android数据库默认存储路径不同,可通过`plus.sqlite.getDatabasePath()`获取具体路径 - **异步处理**:所有SQL操作需在事务回调中完成,避免直接操作DOM - **错误捕获**:务必添加`transaction`的error回调,处理SQL语法错误 - **数据类型**:SQLite采用动态类型,但建议明确定义字段类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值