您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # 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);
    }
}
DBHelper dbHelper = new DBHelper(context);
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 方式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[]{"张三"});
db.beginTransaction();
try {
    // 批量操作...
    db.setTransactionSuccessful(); // 标记事务成功
} finally {
    db.endTransaction(); // 结束事务
}
@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的升级逻辑
        // ...
    }
}
SQLiteStatement stmt = db.compileStatement(
    "INSERT INTO users (name) VALUES (?)");
stmt.bindString(1, "王五");
long id = stmt.executeInsert();
stmt.close();
@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)");
}
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();
}
adb shell查看数据库文件:adb shell
cd /data/data/<package>/databases
sqlite3 mydb.db
.tables
.schema users
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();
cursor.getColumnIndex()获取列索引cursor.getType()判断字段类型VACUUM命令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字,可根据需要增减细节内容调整篇幅)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。