首页 > 解决方案 > 无法使用房间数据库获取数据

问题描述

我创建了一个虚拟项目来学习 Room 数据库。我创建了一个 .db 文件并将其保存在名为 database 的目录下的 Assets 文件夹中。我创建了 Database 类、Entity 类和 Dao 接口。编译时,我在 logcat 中收到警告:“com.example.mydatabasetrial3 W/System:资源调用关闭失败。” 不确定这是否重要,因为 gradle 构建成功完成。当我通过单击按钮运行程序时,我在 logcat 中得到以下信息: I/ViewRootImpl@297f419[MainActivity]: ViewPostIme pointer 0 I/ViewRootImpl@297f419[MainActivity]: ViewPostIme pointer 1 D/ContentValues: null

数据库代码



import android.content.Context;

import androidx.room.Database;

import androidx.room.Room;
import androidx.room.RoomDatabase;

@Database(entities = {Sample.class}, version =1)

public abstract class SampleDatabase extends RoomDatabase {

    public abstract SampleDao sampleDao();

    private static volatile SampleDatabase INSTANCE;

    static SampleDatabase getInstance(Context context) {

        if (INSTANCE == null) {

            synchronized (SampleDatabase.class){
                if (INSTANCE == null) {

                        INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                                SampleDatabase.class, "sample")
                                .createFromAsset("database/simple.db")
                                .build();


                }


            }

        }
        return INSTANCE;

    }

}

道码:

package com.example.mydatabasetrial3;


import androidx.room.Dao;
import androidx.room.Query;

@Dao
public interface SampleDao {

    @Query("SELECT * FROM simple_table WHERE uid LIKE :uid")
    Sample findStocksById(int uid);


}

实体代码

package com.example.mydatabasetrial3;


import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;

@Entity (tableName = "simple_table")
public class Sample {


@PrimaryKey(autoGenerate = false)
@ColumnInfo(name = "uid")
private int uid;

@ColumnInfo(name = "year_1")
private int year1;

@ColumnInfo(name ="year_2")
private int year2;

    @Override
    public String toString() {
        return "Sample{" +
                "uid=" + uid +
                ", year1=" + year1 +
                ", year2=" + year2 +
                '}';
    }

    public Sample(int uid, int year1, int year2) {
        this.uid = uid;
        this.year1 = year1;
        this.year2 = year2;
    }

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public int getYear1() {
        return year1;
    }

    public void setYear1(int year1) {
        this.year1 = year1;
    }

    public int getYear2() {
        return year2;
    }

    public void setYear2(int year2) {
        this.year2 = year2;
    }
}

主要活动

package com.example.mydatabasetrial3;

import static android.content.ContentValues.TAG;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

import java.util.List;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    public void extract(View view){

        new Thread(new Runnable() {

            @Override
            public void run() {

                List<Sample> stocks = (List<Sample>) SampleDatabase.getInstance(getApplicationContext())
                        .sampleDao()
                        .findStocksById(2);

                Log.d(TAG, String.valueOf(stocks));

            }
        }).start();


    }



}

我的 xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Data"
        android:onClick="extract"></Button>

</RelativeLayout>

这是虚拟数据库的 SQL

CREATE TABLE IF NOT EXISTS simple_table (
    `uid` INT,
    `year_1` INT,
    `year_2` INT
);
INSERT INTO simple_table VALUES
    (1,23,24),
    (2,34,46);

任何帮助,将不胜感激。此外,我的最终目标是预填充更大的 (100x50) 数据库表。有没有更好的方法来做到这一点?

标签: sqlandroid-room

解决方案


推荐阅读