如何解决房间预填充数据库错误:查询返回的列没有字段 [rowid]
请耐心等待,我对 Android 开发非常陌生。我的目标是使用 Room 从资产文件夹加载一个带有预填充数据库的应用。
问题
经过数小时的搜索和搜索,包括所有其他具有相同错误的问题,我无法在 Dao 文件中修复这些错误:
-
此错误发生在 methodA():查询返回的列在 com.hfad.appname.ClassName 中没有字段 [rowid,integerB],即使它们被注释为非空或原始。查询返回的列:[textA,integerA]
-
此错误发生在 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 举报,一经查实,本站将立刻删除。