在Android开发中,SQLite是一种非常常用的数据库存储方式。它轻量、简单,非常适合移动设备上的数据管理。本文将通过通俗易懂的语言,结合代码示例和具体场景,详细讲解SQLite在Android中的使用。
1. 什么是SQLite?
SQLite是一个开源的、嵌入式的关系型数据库。它不需要像MySQL那样运行一个独立的服务器,而是直接将数据存储在一个文件中。这个文件可以随着你的应用一起打包,方便管理。简单来说,SQLite就像一个“便携式笔记本”,你可以在里面记录和管理数据。
2. 为什么在Android中使用SQLite?
- 轻量级: SQLite占用资源少,适合手机这种硬件资源有限的设备。
- 无需服务器: 不需要额外的服务器支持,直接嵌入应用中使用。
- 自包含: 数据库文件独立存在,易于备份和分发。
- 支持SQL: 使用标准的SQL语法,如果你学过数据库,上手会很快。
总之,SQLite是Android开发中内置的“标配”数据库,特别适合存储结构化数据,比如用户信息、任务列表等。
3. SQLite在Android中的基本使用步骤
使用SQLite主要涉及以下几个步骤:
- 创建数据库: 通过
SQLiteOpenHelper
类来创建和管理数据库。 - 定义表结构: 在
onCreate
方法中用SQL语句创建表。 - 插入数据: 往表里添加数据。
- 查询数据: 从表中读取数据。
- 更新数据: 修改表中的数据。
- 删除数据: 删除表中的数据。
接下来,我们通过代码和一个具体的通讯录应用场景来详细讲解这些步骤。
4. 代码示例
4.1 创建数据库和表
首先,我们需要创建一个类继承SQLiteOpenHelper
,用来管理数据库和表的创建。
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "my_database.db"; // 数据库文件名
private static final int DATABASE_VERSION = 1; // 数据库版本号
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// 创建表的SQL语句
String createTableSQL = "CREATE TABLE users (" +
"id INTEGER PRIMARY KEY AUTOINCREMENT," + // 主键,自增
"name TEXT," + // 姓名,文本类型
"age INTEGER)"; // 年龄,整型
db.execSQL(createTableSQL); // 执行SQL,创建表
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 数据库升级时执行,比如删除旧表并重建
db.execSQL("DROP TABLE IF EXISTS users");
onCreate(db);
}
}
DATABASE_NAME
: 数据库文件名,通常以.db
结尾。DATABASE_VERSION
: 数据库版本号,如果表结构有变化,需要增加版本号。onCreate
: 第一次创建数据库时调用,定义表的结构。onUpgrade
: 当版本号变化时调用,用于处理旧数据迁移。
4.2 插入数据
插入数据可以用insert
方法,简单高效。
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
public void insertUser(String name, int age) {
SQLiteDatabase db = getWritableDatabase(); // 获取可写数据库对象
ContentValues values = new ContentValues(); // 用于存放键值对
values.put("name", name); // 插入姓名
values.put("age", age); // 插入年龄
db.insert("users", null, values); // 插入到users表
db.close(); // 关闭数据库连接
}
getWritableDatabase()
: 获取一个可以读写的数据库对象。ContentValues
: 像一个“包裹”,把要插入的数据装进去。insert
: 将数据插入表中。
4.3 查询数据
查询数据可以用query
方法,返回一个Cursor
对象,类似于指针,指向查询结果。
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.ArrayList;
import java.util.List;
class User {
int id;
String name;
int age;
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
}
public List<User> getAllUsers() {
List<User> userList = new ArrayList<>();
SQLiteDatabase db = getReadableDatabase(); // 获取只读数据库对象
Cursor cursor = db.query("users", null, null, null, null, null, null); // 查询所有数据
if (cursor.moveToFirst()) { // 移动到第一条数据
do {
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
User user = new User(id, name, age);
userList.add(user);
} while (cursor.moveToNext()); // 移动到下一条数据
}
cursor.close(); // 关闭游标
db.close(); // 关闭数据库
return userList;
}
getReadableDatabase()
: 获取只读数据库对象。Cursor
: 查询结果的“指针”,可以逐行读取数据。moveToFirst
和moveToNext
: 控制游标移动,遍历所有数据。
4.4 更新数据
更新数据可以用update
方法。
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
public void updateUser(int id, String newName, int newAge) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", newName);
values.put("age", newAge);
db.update("users", values, "id=?", new String[]{String.valueOf(id)}); // 根据id更新
db.close();
}
update
: 参数分别是表名、更新内容、条件和条件值。
4.5 删除数据
删除数据可以用delete
方法。
import android.database.sqlite.SQLiteDatabase;
public void deleteUser(int id) {
SQLiteDatabase db = getWritableDatabase();
db.delete("users", "id=?", new String[]{String.valueOf(id)}); // 根据id删除
db.close();
}
delete
: 参数分别是表名、条件和条件值。
5. 具体使用场景:通讯录应用
假设我们要开发一个简单的通讯录应用,存储联系人的姓名和电话号码。以下是如何用SQLite实现这个功能。
5.1 创建数据库和表
修改DatabaseHelper
中的表结构:
@Override
public void onCreate(SQLiteDatabase db) {
String createTableSQL = "CREATE TABLE contacts (" +
"id INTEGER PRIMARY KEY AUTOINCREMENT," +
"name TEXT," +
"phone TEXT)";
db.execSQL(createTableSQL);
}
5.2 插入联系人
public void insertContact(String name, String phone) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", name);
values.put("phone", phone);
db.insert("contacts", null, values);
db.close();
}
5.3 查询所有联系人
class Contact {
int id;
String name;
String phone;
public Contact(int id, String name, String phone) {
this.id = id;
this.name = name;
this.phone = phone;
}
}
public List<Contact> getAllContacts() {
List<Contact> contactList = new ArrayList<>();
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.query("contacts", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
Contact contact = new Contact(id, name, phone);
contactList.add(contact);
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return contactList;
}
5.4 更新联系人信息
public void updateContact(int id, String newName, String newPhone) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", newName);
values.put("phone", newPhone);
db.update("contacts", values, "id=?", new String[]{String.valueOf(id)});
db.close();
}
5.5 删除联系人
public void deleteContact(int id) {
SQLiteDatabase db = getWritableDatabase();
db.delete("contacts", "id=?", new String[]{String.valueOf(id)});
db.close();
}
通过这些代码,我们可以实现一个简单的通讯录功能:添加联系人、查看所有联系人、修改联系人信息和删除联系人。
6. 注意事项
- 数据库版本管理: 如果表结构变了(比如增加字段),需要更新
DATABASE_VERSION
,并在onUpgrade
中处理旧数据。 - 线程安全: 数据库操作不要阻塞主线程,可以用
AsyncTask
或线程池来处理。 - 关闭连接: 操作完数据库后,记得调用
close()
释放资源。 - 异常处理: 操作数据库时可能会出错,要用
try-catch
捕获异常,比如SQLiteException
。
7. 总结
SQLite是Android开发中强大又简单的数据库工具。通过SQLiteOpenHelper
和SQLiteDatabase
,我们可以轻松实现数据的增删改查。结合通讯录这个例子,你应该已经掌握了SQLite的基本用法。在实际开发中,还可以根据需要使用更复杂的查询语句或事务管理,进一步提升应用的性能和功能。