Android如何操作SQLite

发布时间:2021-12-18 13:01:16 作者:小新
来源:亿速云 阅读:300
# Android如何操作SQLite

## 一、SQLite简介

SQLite是一款轻量级的关系型数据库,具有以下特点:
- 无需服务器进程
- 零配置
- 事务性(ACID兼容)
- 单个磁盘文件存储
- 支持标准SQL语法
- 非常适合移动设备使用

在Android平台上,SQLite是默认集成的数据库引擎,被广泛用于本地数据存储场景。

## 二、核心组件类

### 1. SQLiteOpenHelper
抽象帮助类,用于数据库创建和版本管理。主要方法:
- `onCreate()` - 首次创建数据库时调用
- `onUpgrade()` - 数据库升级时调用
- `getWritableDatabase()` - 获取可写数据库实例
- `getReadableDatabase()` - 获取只读数据库实例

### 2. SQLiteDatabase
数据库访问入口,提供:
- 执行SQL语句
- 增删改查操作
- 事务处理

### 3. Cursor
查询结果集,支持:
- 遍历结果
- 按列名/索引获取数据
- 类型转换

## 三、完整使用流程

### 1. 创建数据库帮助类

```java
public class DBHelper extends SQLiteOpenHelper {
    private static final String DB_NAME = "mydb.db";
    private static final int DB_VERSION = 1;
    
    public DBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE users (" +
                "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                "name TEXT NOT NULL," +
                "age INTEGER," +
                "email TEXT UNIQUE)";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS users");
        onCreate(db);
    }
}

2. 初始化数据库连接

DBHelper dbHelper = new DBHelper(context);
SQLiteDatabase db = dbHelper.getWritableDatabase();

3. 执行CRUD操作

插入数据

// 方式1:使用ContentValues
ContentValues values = new ContentValues();
values.put("name", "张三");
values.put("age", 25);
values.put("email", "zhangsan@example.com");
long id = db.insert("users", null, values);

// 方式2:直接执行SQL
String sql = "INSERT INTO users (name,age,email) VALUES (?,?,?)";
db.execSQL(sql, new Object[]{"李四", 30, "lisi@test.com"});

查询数据

// 参数说明:表名、列名数组、WHERE条件、条件参数、GROUP BY、HAVING、ORDER BY
Cursor cursor = db.query("users", 
        new String[]{"_id", "name", "age"}, 
        "age > ?", 
        new String[]{"20"}, 
        null, null, "age DESC");

try {
    while (cursor.moveToNext()) {
        int id = cursor.getInt(0);
        String name = cursor.getString(1);
        int age = cursor.getInt(2);
        // 处理数据...
    }
} finally {
    cursor.close(); // 必须关闭Cursor
}

更新数据

ContentValues values = new ContentValues();
values.put("age", 26);
int count = db.update("users", 
        values, 
        "_id = ?", 
        new String[]{"1"});

删除数据

int count = db.delete("users", 
        "name = ?", 
        new String[]{"张三"});

4. 使用事务

db.beginTransaction();
try {
    // 批量操作...
    db.setTransactionSuccessful(); // 标记事务成功
} finally {
    db.endTransaction(); // 结束事务
}

四、最佳实践

1. 数据库升级策略

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 2) {
        // 版本1到2的升级逻辑
        db.execSQL("ALTER TABLE users ADD COLUMN phone TEXT");
    }
    if (oldVersion < 3) {
        // 版本2到3的升级逻辑
        // ...
    }
}

2. 使用预编译语句

SQLiteStatement stmt = db.compileStatement(
    "INSERT INTO users (name) VALUES (?)");
stmt.bindString(1, "王五");
long id = stmt.executeInsert();
stmt.close();

3. 数据库索引优化

@Override
public void onCreate(SQLiteDatabase db) {
    // 创建表后添加索引
    db.execSQL("CREATE INDEX idx_user_name ON users(name)");
    db.execSQL("CREATE INDEX idx_user_email ON users(email)");
}

五、高级用法

1. 使用Room持久化库

Room是Google推荐的SQLite抽象层:

@Entity
public class User {
    @PrimaryKey(autoGenerate = true)
    public int id;
    public String name;
    public int age;
}

@Dao
public interface UserDao {
    @Insert
    void insert(User user);
    @Query("SELECT * FROM user")
    List<User> getAll();
}

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

2. 数据库调试技巧

adb shell
cd /data/data/<package>/databases
sqlite3 mydb.db
.tables
.schema users

3. 数据迁移示例

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("ALTER TABLE users ADD COLUMN address TEXT");
    }
};

Room.databaseBuilder(context, AppDatabase.class, "mydb")
    .addMigrations(MIGRATION_1_2)
    .build();

六、性能优化建议

  1. 批量操作使用事务:减少磁盘I/O次数
  2. 合理使用索引:提高查询效率但会增加写入开销
  3. 及时关闭资源:Cursor、Database连接等
  4. 避免在主线程操作:使用AsyncTask或RxJava
  5. 限制查询结果集:使用LIMIT分页
  6. 使用投影减少数据量:只查询需要的列

七、常见问题解决方案

1. 数据库锁定问题

2. 数据类型转换异常

3. 数据库膨胀问题

八、完整示例项目结构

app/
├── java/
│   ├── com.example.app/
│   │   ├── data/
│   │   │   ├── DBHelper.java
│   │   │   ├── UserContract.java (定义表结构常量)
│   │   │   └── UserDao.java
│   │   ├── models/
│   │   │   └── User.java
│   │   └── activities/
│   │       └── MainActivity.java
└── res/
    └── raw/ (可存放预置数据库文件)

通过本文介绍,你应该已经掌握了Android平台操作SQLite数据库的核心知识和实践技巧。在实际开发中,建议根据项目复杂度选择原生SQLite API或Room等ORM框架,并始终注意性能优化和数据安全。 “`

(注:实际字数为约2000字,可根据需要增减细节内容调整篇幅)

推荐阅读:
  1. android sqlite数据库操作
  2. Python 操作 SQLite 数据库

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

android sqlite

上一篇:Python字符串函数怎么用

下一篇:如何进行springboot配置templates直接访问的实现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》