我想为我的数据库应用程序使用 Room 库。 我想从 Assets 文件夹中打开一个数据库并获取所有行。
我用这种方式打开数据库: https://github.com/humazed/RoomAsset .
错误:
java.lang.IllegalStateException: Migration didn't properly handle quiz(com.example.user.testroomlibrary3.Quiz).
Expected:
TableInfo{name='quiz', columns={quiz_date=Column{name='quiz_date', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, class_id=Column{name='class_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1}, quiz_name=Column{name='quiz_name', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}
Found:
TableInfo{name='quiz', columns={class_id=Column{name='class_id', type='int', affinity='3', notNull=false, primaryKeyPosition=1}, quiz_date=Column{name='quiz_date', type='date', affinity='1', notNull=false, primaryKeyPosition=0}, quiz_name=Column{name='quiz_name', type='nvarchar(50)', affinity='2', notNull=false, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}
我的代码:
主要内容:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final AppDatabase db = AppDatabase.getAppDatabase(MainActivity.this);
new Thread(new Runnable() {
@Override
public void run() {
List<Quiz> quizList = db.quizDao().getAll();
Log.d("Main", "list = " + quizList);
}
}).start();
}
测验:
@Entity(tableName = "quiz")
public class Quiz {
@PrimaryKey
@ColumnInfo(name = "class_id")
private int id;
@ColumnInfo(name = "quiz_name")
private String name;
@ColumnInfo(name = "quiz_date")
private String date;
}
测验道:
@Dao
public interface QuizDao {
@Query("SELECT * FROM quiz")
List<Quiz> getAll();
}
应用程序数据库:
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase INSTANCE;
public abstract QuizDao quizDao();
public static AppDatabase getAppDatabase(Context context)
{
if(INSTANCE == null)
{
INSTANCE = RoomAsset.databaseBuilder(context.getApplicationContext() ,
AppDatabase.class , "TEST.db").build();
}
return INSTANCE;
}
}
表查询:
CREATE TABLE quiz(
class_id int primary key,
quiz_name nvarchar(50) ,
quiz_date date);
最佳答案
问题在于 Room 期望表中的列具有特定的列类型。
那些是 INTEGER、TEXT、BLOB 或 REAL(使用哪一个取决于列的实体中定义的 java 类型)。
这样说它期望:-
quiz_name=Column{name='quiz_name', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}
但发现:-
quiz_name=Column{name='quiz_name', type='nvarchar(50)', affinity='2', notNull=false, primaryKeyPosition=0}
这是说它期望使用 TEXT 而不是 nvarchar(50)。
因此,您需要将复制到 Assets 文件夹中的表转换为使用列定义:-
quiz_name TEXT
关于android - 房间数据库错误 : Migration didn't properly handle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57202635/