Java 文件室不自动创建json模式文件
我有一个应用程序,它可以很好地与SQLite数据库配合使用。我想升级到Room,我遵循和文章进行测试,并从SQLite升级到Room 我创建了实体、DAO和数据库类 以下是我的版本。gradle:appJava 文件室不自动创建json模式文件,java,android,sqlite,android-room,Java,Android,Sqlite,Android Room,我有一个应用程序,它可以很好地与SQLite数据库配合使用。我想升级到Room,我遵循和文章进行测试,并从SQLite升级到Room 我创建了实体、DAO和数据库类 以下是我的版本。gradle:app apply plugin: 'com.android.application' android { compileSdkVersion 28 buildToolsVersion '28.0.3' defaultConfig { applicationI
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
buildToolsVersion '28.0.3'
defaultConfig {
applicationId "APP ID"
minSdkVersion 20
targetSdkVersion 28
versionCode 10
versionName "1.4.5"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
}
sourceSets {
androidTest.assets.srcDirs += files("$projectDir/schemas".toString())
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
repositories {
maven {
url 'http://dl.bintray.com/amulyakhare/maven'
}
}
}
dependencies {
def room_version = "1.1.1"
implementation fileTree(dir: 'libs', include: ['*.jar'])
// Core library
androidTestImplementation 'androidx.test:core:1.0.0'
androidTestImplementation "androidx.test.ext:junit:1.0.0"
androidTestImplementation 'androidx.test:rules:1.1.0'
androidTestImplementation 'android.arch.persistence.room:testing:1.1.1'
implementation "androidx.room:room-runtime:2.1.0-alpha03"
implementation "androidx.appcompat:appcompat:1.0.2"
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
implementation 'com.googlecode.libphonenumber:libphonenumber:8.8.1'
implementation 'com.facebook.stetho:stetho:1.5.0'
implementation 'com.google.android.material:material:1.1.0-alpha01'
implementation 'com.hbb20:ccp:2.0.3'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'com.google.firebase:firebase-ads:11.4.2'
implementation 'com.google.firebase:firebase-crash:11.4.2'
}
下面是用于创建数据库副本的测试类
public class SqliteTestDbOpenHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 10;
public SqliteTestDbOpenHelper(Context context, String databaseName) {
super(context, databaseName, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
String CREATE_CONTACTS_TABLE = "CREATE TABLE " + ContactsDBContract.ContactsTable.TABLE_CONTACTS +
"(" +
ContactsDBContract.ContactsTable._ID + " INTEGER PRIMARY KEY," + // Define a primary key
ContactsDBContract.ContactsTable.CONTACT_ID + " TEXT, " +
ContactsDBContract.ContactsTable.CONTACT_LOOKUP_KEY + " TEXT, " +
ContactsDBContract.ContactsTable.CONTACT_MESSAGE+ " TEXT, " +
ContactsDBContract.ContactsTable.CONTACT_NAME+ " TEXT, " +
ContactsDBContract.ContactsTable.CONTACT_PHONE_NUMBER + " TEXT, " +
ContactsDBContract.ContactsTable.CONTACT_DATA_VERSION+ " TEXT, " +
ContactsDBContract.ContactsTable.CONTACT_STAMP_STATUS+ " TEXT, " +
ContactsDBContract.ContactsTable.CONTACT_MIMETYPE+ " TEXT, " +
ContactsDBContract.ContactsTable.IS_BLOCK+ " INTEGER " +
")";
String CREATE_BLOCK_TABLE = "CREATE TABLE " + ContactsDBContract.BlockTable.TABLE_BLOCKS +
"(" +
ContactsDBContract.BlockTable._ID + " INTEGER PRIMARY KEY," + // Define a primary key
ContactsDBContract.BlockTable.BLOCK_CONTACT_PHONE_NUMBER + " TEXT, " +
ContactsDBContract.BlockTable.BLOCK_CONTACT_NAME+ " TEXT " +
")";
String CREATE_SCHEDULE_TABLE="CREATE TABLE " + ContactsDBContract.ScheduleTable.SCHEDULE_TABLE +
"(" +
ContactsDBContract.ScheduleTable._ID + " INTEGER PRIMARY KEY," + // Define a primary key
ContactsDBContract.ScheduleTable.SCHEDULE_START_TIME + " TEXT, " +
ContactsDBContract.ScheduleTable.SCHEDULE_END_TIME+ " TEXT " +
")";
try {
db.execSQL(CREATE_BLOCK_TABLE);
db.execSQL(CREATE_CONTACTS_TABLE);
db.execSQL(CREATE_SCHEDULE_TABLE);
} catch (SQLException e) {
e.printStackTrace();
FirebaseCrash.report(e);
}
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Not required as at version 1
}
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Not required as at version 1
}
}
下面是我的房间数据库类
@Database(entities = {ContactsData.class,SchedulesData.class,BlocksData.class}, version = 11,exportSchema = true)
public abstract class DatabaseManager extends RoomDatabase {
private DatabaseManager database;
public abstract ContactDao contactsDao();
public abstract SchedulesDao schedulesDao();
public abstract BlocksDao blocksDao();
@VisibleForTesting
public static Migration MIGRATION_10_11 = new Migration(10,11) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
// nothing to do because we did not change anything
}
};
public DatabaseManager getInstance(Context context){
if(database == null){
database = Room.databaseBuilder(context.getApplicationContext(),DatabaseManager.class,"ContactsDB,db")
.addMigrations(MIGRATION_10_11).build();
}
return database;
}
}
下面是我的迁移测试类
@RunWith(AndroidJUnit4.class)
public class MigrationTest {
private static final String TEST_DB_NAME = "Contactsdb";
// Helper for creating Room databases and migrations
@Rule
public MigrationTestHelper mMigrationTestHelper =
new MigrationTestHelper(InstrumentationRegistry.getInstrumentation(),
DatabaseManager.class.getCanonicalName(),
new FrameworkSQLiteOpenHelperFactory());
// Helper for creating SQLite database in version 1
private SqliteTestDbOpenHelper mSqliteTestDbHelper;
@Before
public void setUp() throws Exception {
// To test migrations from version 1 of the database, we need to create the database
// with version 1 using SQLite API
mSqliteTestDbHelper = new SqliteTestDbOpenHelper(ApplicationProvider.getApplicationContext(),
TEST_DB_NAME);
// We're creating the table for every test, to ensure that the table is in the correct state
SqliteDatabaseTestHelper.createTable(mSqliteTestDbHelper);
}
@After
public void tearDown() throws Exception {
// Clear the database after every test
SqliteDatabaseTestHelper.clearDatabase(mSqliteTestDbHelper);
}
@Test
public void migrationFrom1To2_containsCorrectData() throws IOException {
// Create the database with the initial version 1 schema and insert a user
SqliteDatabaseTestHelper.addContact(mSqliteTestDbHelper);
// Create the database with the initial version 1 schema and insert a user
//SqliteDatabaseTestHelper.insertContact(1, "zaid", mSqliteTestDbHelper);
mMigrationTestHelper.runMigrationsAndValidate(TEST_DB_NAME, 11, true,
MIGRATION_10_11);
// Get the latest, migrated, version of the database
DatabaseManager latestDb = getMigratedRoomDatabase();
// Check that the correct data is in the database
List<ContactsData> dbUser = latestDb.contactsDao().getAll();
assertThat(dbUser.size(),is(1));
}
@Test
public void startInVersion2_containsCorrectData() throws IOException {
// Create the database with version 2
SupportSQLiteDatabase db = mMigrationTestHelper.createDatabase(TEST_DB_NAME, 3);
// db has schema version 2. insert some data
insertContact(db);
db.close();
// open the db with Room
DatabaseManager usersDatabase = getMigratedRoomDatabase();
// verify that the data is correct
// Get the latest, migrated, version of the database
DatabaseManager latestDb = getMigratedRoomDatabase();
// Check that the correct data is in the database
List<ContactsData> dbUser = latestDb.contactsDao().getAll();
assertThat(dbUser.size(),is(1));
}
private DatabaseManager getMigratedRoomDatabase() {
DatabaseManager database = Room.databaseBuilder(ApplicationProvider.getApplicationContext(),
DatabaseManager.class, TEST_DB_NAME)
.addMigrations(MIGRATION_10_11)
.build();
// close the database and release any stream resources when the test finishes
mMigrationTestHelper.closeWhenFinished(database);
return database;
}
private void insertContact(SupportSQLiteDatabase db) {
ContentValues cv=new ContentValues();
cv.put(ContactsDBContract.ContactsTable.CONTACT_ID,"212222");
cv.put(ContactsDBContract.ContactsTable.CONTACT_NAME,"Moti");
cv.put(ContactsDBContract.ContactsTable.CONTACT_LOOKUP_KEY,"Okay-uuss");
cv.put(ContactsDBContract.ContactsTable.CONTACT_PHONE_NUMBER,"03215467845");
db.insert(ContactsDBContract.ContactsTable.TABLE_CONTACTS, SQLiteDatabase.CONFLICT_REPLACE, cv);
}
}
正如官方文档中所解释的,架构似乎不是在编译时创建的。可能是我理解错了您的Android Room初始设置不正确。您错过了它的注释处理器依赖项。从您可以在这里找到的官方文档来看,对于AndroidX,您应该有两行代码:
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version" // use kapt for Kotlin
然后重建project并查看$projectDir/schemas文件夹:您的架构应该在其中。您的Android Room初始设置不正确。您错过了它的注释处理器依赖项。从您可以在这里找到的官方文档来看,对于AndroidX,您应该有两行代码:
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version" // use kapt for Kotlin
然后重建project并查看$projectDir/schemas文件夹:您的架构应该在其中。这个技巧的目的是: 在应用程序模块的app build.gradle文件中添加以下定义:
android {
………
defaultConfig {
………
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
// *** For Kotlin ****
// kapt {
// arguments {
// arg("room.schemaLocation", "$projectDir/schemas".toString())
//
// }
}
及
这个把戏的目的是: 在应用程序模块的app build.gradle文件中添加以下定义:
android {
………
defaultConfig {
………
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
// *** For Kotlin ****
// kapt {
// arguments {
// arg("room.schemaLocation", "$projectDir/schemas".toString())
//
// }
}
及
甚至在app文件夹中也没有schema文件夹。我也检查过了。你能发布完整的版本吗?具有依赖项和批注处理器。您缺少房间批注处理器。annotationProcessor androidx.room:room编译器:$room\u版本//使用kapt表示KotlinThanks。正在创建架构,但现在我收到新错误。。。。。。java.lang.NoSuchMethodError:没有直接方法Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Factory;Landroidx/room/RoomDatabase$MigrationContainer;Ljava/util/List;ZLandroidx/room/RoomDatabase$JournalMode;Ljava/util/concurrent/Executor;ZLjava/util/Set;V类Landroidx/房间/数据库配置;或其超类声明“androidx.room.DatabaseConfiguration”出现在/data/app/apppackage-2/base.apkold中,新错误出现在这一行mmiglationTestHelper.runMigrationsAndValidateTEST\u DB\u NAME,11,true,MIGRATION\u 10\u 11;甚至在app文件夹中也没有schema文件夹。我也检查过了。你能发布完整的版本吗?具有依赖项和批注处理器。您缺少房间批注处理器。annotationProcessor androidx.room:room编译器:$room\u版本//使用kapt表示KotlinThanks。正在创建架构,但现在我收到新错误。。。。。。java.lang.NoSuchMethodError:没有直接方法Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Factory;Landroidx/room/RoomDatabase$MigrationContainer;Ljava/util/List;ZLandroidx/room/RoomDatabase$JournalMode;Ljava/util/concurrent/Executor;ZLjava/util/Set;V类Landroidx/房间/数据库配置;或其超类声明“androidx.room.DatabaseConfiguration”出现在/data/app/apppackage-2/base.apkold中,新错误出现在这一行mmiglationTestHelper.runMigrationsAndValidateTEST\u DB\u NAME,11,true,MIGRATION\u 10\u 11;这是获得模式输出所必需的。谢谢这是获得模式输出所必需的。谢谢