当前位置:首页 > 行业动态 > 正文

安卓开发怎么读取表的数据

使用 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);
    }
}

定义表结构并插入数据(可选)

如果表中无数据,需先插入测试数据:

安卓开发怎么读取表的数据  第1张

SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "张三");
values.put("age", 25);
db.insert("users", null, values);

查询表中的数据

通过 SQLiteDatabaserawQueryquery 方法执行 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());
    }
});

注意事项

问题 解决方案
主线程操作数据库导致崩溃 使用 AsyncTaskThreadCoroutine 在子线程执行数据库操作
未关闭 Cursor 导致内存泄漏 使用 try-finallyCursorLoader 自动管理 Cursor
Room 数据库升级失败 @Database 中设置 version,并实现 Migrationfallbacks

相关问题与解答

问题1:如何更新 SQLite 表中的数据?

解答
使用 SQLiteDatabaseupdate 方法,结合 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);
0