上一篇
安卓开发怎么读取表的数据
- 行业动态
- 2025-04-22
- 6
使用 SQLite 读取本地数据库表数据
创建或打开数据库
在 Android 中,通常通过继承 SQLiteOpenHelper
来管理数据库,需实现 onCreate()
和 onUpgrade()
方法。
public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "mydatabase.db"; private static final int DATABASE_VERSION = 1; public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建表的 SQL 语句 String createTable = "CREATE TABLE users (" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT," + "age INTEGER)"; db.execSQL(createTable); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 更新表结构逻辑(如删除旧表) db.execSQL("DROP TABLE IF EXISTS users"); onCreate(db); } }
定义表结构并插入数据(可选)
如果表中无数据,需先插入测试数据:
SQLiteDatabase db = helper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", "张三"); values.put("age", 25); db.insert("users", null, values);
查询表中的数据
通过 SQLiteDatabase
的 rawQuery
或 query
方法执行 SQL 查询。
// 获取只读数据库 SQLiteDatabase db = helper.getReadableDatabase(); // 方式1:直接执行 SQL 查询 Cursor cursor = db.rawQuery("SELECT FROM users WHERE age > ?", new String[]{"20"}); // 方式2:使用 query 方法(参数:表名、列名、条件等) / Cursor cursor = db.query("users", new String[]{"id", "name", "age"}, // 指定列名 "age > ?", // WHERE 条件 new String[]{"20"}, // 条件参数 null, // groupBy null, // having "age DESC" // orderBy ); / // 遍历 Cursor 获取数据 if (cursor != null) { while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); Log.d("DB_RESULT", "ID: " + id + ", Name: " + name + ", Age: " + age); } cursor.close(); // 必须关闭 Cursor }
使用 Room 持久库读取数据(推荐现代方式)
Room 是 Android 官方推荐的数据库层封装库,提供编译时检查和流畅的 API。
定义实体类
@Entity(tableName = "users") public class User { @PrimaryKey(autoGenerate = true) public int id; @ColumnInfo(name = "name") public String name; @ColumnInfo(name = "age") public int age; }
创建 DAO 接口
@Dao public interface UserDao { @Query("SELECT FROM users WHERE age > :minAge") List<User> getUsersOlderThan(int minAge); }
创建数据库类
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
查询数据
AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app-db").build(); List<User> users = db.userDao().getUsersOlderThan(20); for (User user : users) { Log.d("ROOM_RESULT", "ID: " + user.id + ", Name: " + user.name); }
通过网络 API 读取远程表数据(以 JSON 为例)
使用 Retrofit + Gson 解析 JSON
// 定义 API 接口 public interface ApiService { @GET("api/users") Call<List<User>> getUsers(); } // 创建 Retrofit 实例 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://example.com/") .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); // 发送请求并处理响应 apiService.getUsers().enqueue(new Callback<List<User>>() { @Override public void onResponse(Call<List<User>> call, Response<List<User>> response) { if (response.isSuccessful()) { List<User> users = response.body(); for (User user : users) { Log.d("API_RESULT", "ID: " + user.id + ", Name: " + user.name); } } } @Override public void onFailure(Call<List<User>> call, Throwable t) { Log.e("API_ERROR", t.getMessage()); } });
注意事项
问题 | 解决方案 |
---|---|
主线程操作数据库导致崩溃 | 使用 AsyncTask 、Thread 或 Coroutine 在子线程执行数据库操作 |
未关闭 Cursor 导致内存泄漏 | 使用 try-finally 或 CursorLoader 自动管理 Cursor |
Room 数据库升级失败 | 在 @Database 中设置 version ,并实现 Migration 或 fallbacks |
相关问题与解答
问题1:如何更新 SQLite 表中的数据?
解答:
使用 SQLiteDatabase
的 update
方法,结合 ContentValues
指定更新字段和条件。
ContentValues values = new ContentValues(); values.put("age", 26); db.update("users", values, "name = ?", new String[]{"张三"});
问题2:Room 如何实现复杂查询(如多表关联)?
解答:
在 DAO 中使用 @Query
注解编写原生 SQL,或通过 Relation
类定义实体关系。
@Query("SELECT FROM users JOIN orders ON users.id = orders.user_id WHERE users.age > :minAge") LiveData<List<UserWithOrders>> getUsersAndOrders(int minAge);