微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

房间预填充数据库错误:查询返回的列没有字段 [rowid]

如何解决房间预填充数据库错误:查询返回的列没有字段 [rowid]

请耐心等待,我对 Android 开发非常陌生。我的目标是使用 Room 从资产文件夹加载一个带有预填充数据库的应用。

问题

经过数小时的搜索搜索包括所有其他具有相同错误的问题,我无法在 Dao 文件中修复这些错误

  1. 错误发生在 methodA():查询返回的列在 com.hfad.appname.ClassName 中没有字段 [rowid,integerB],即使它们被注释为非空或原始。查询返回的列:[textA,integerA]

  2. 错误发生在 methodB():查询返回的列在 com.hfad.appname.ClassName 中没有字段 [rowid],即使它们被注释为非空或原始。查询返回的列:[textA,textB,integerA,integerB]

示例程序

我通过将 .csv 文件(如下)导入 sqlite 的 DB browser 创建了一个 sample.db 文件

rowid textA textB 整数A 整数B
没有 0 0

DB browser 中的列是它们各自的 INTEGER 和 TEXT 类型。 (如果 rowid 没有上述值或其中放置的数字,则无关紧要,错误仍然存​​在。)我将 sample.db 粘贴到 Android Studio 中新创建的资产文件夹中。

实体 ClassName.java 文件

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

@Fts4
@Entity(tableName = "sample")
public class ClassName {
    @PrimaryKey(autoGenerate = true)
    private int rowid;
    private String textA;
    private String textB;
    private int integerA;
    private int integerB;

    public ClassName(String textA,String textB,int integerA,int integerB){
        this.textA = textA;
        this.textB = textB;
        this.integerA = integerA;
        this.integerB = integerB;
    }
    public int getRowid(){
        return this.rowid;
    }
    public String getTextA(){
        return this.textA;
    }
    public String getTextB(){
        return this.textB;
    }
    public String getIntegerA(){
        return this.integerA;
    }
    public String getIntegerB(){
        return this.integerB;
    }

    public void setRowid(int rowid){
        this.rowid=rowid;
    }
}

Dao ClassNameDao.java 文件

import androidx.room.Dao;
import androidx.room.Query;
import java.util.List;

@Dao
public interface ClassNameDao {

    @Query("SELECT `textA`,integerA FROM sample")
    public List<ClassName> methodA();

    @Query("SELECT * FROM sample WHERE integerA > :number")
    public ClassName[] methodB(int number);
}

数据库 ClassNameDatabase.java 文件

import androidx.room.Database;
import androidx.room.RoomDatabase;

@Database(entities={ClassName.class},version=1)
public abstract class ClassNameDatabase extends RoomDatabase {
    public abstract ClassNameDao getClassNameDao();
}

最后,MainActivity:

import androidx.appcompat.app.AppCompatActivity;
import androidx.room.Room;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Room.databaseBuilder(getApplicationContext(),ClassNameDatabase.class,"sample.db")
                .createFromAsset("sample.db")
                .build();
    }
}

非常感谢任何帮助,谢谢。

解决方法

您的 ClassName 定义了 5 列,但查询 methodA() 仅选择了 2 个。

您可以在查询中选择 *,或者如果您实际上只需要这 2 列,您应该创建一个新类,该类仅定义您要使用的 2 列并让 methodA() 返回而不是 ClassName

https://developer.android.com/training/data-storage/room/accessing-data#return-subset

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。