【问题标题】:Trouble with getting an instance of a room-Database获取房间数据库实例的问题
【发布时间】:2017-11-15 10:03:14
【问题描述】:

不幸的是,我在为我的 android 项目获取 Room-Database 实例时遇到了很大的问题。我按照https://developer.android.com/training/data-storage/room/index.html 上的说明进行操作 但最后一步对我不起作用:

AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "database-name").build();

他们的 AppDatabase.java 看起来像这样

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}

我的问题:在“AppDatabase db”我收到错误“无法解析符号“AppDatabase””。这很有意义,因为 AppDatabase 只是一个抽象类。但这应该如何在教程中工作? 我试图在我的 MainActivity 的 onCreate 方法中获取实例。 这是我的gradlefiles: 构建脚本 {

    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
       // NOTE: Do not place your application dependencies here; they belong
      // in the individual module build.gradle files
    }
}

ext {
    buildToolsVersion = "25.0.2"
    supportLibVersion = "25.3.1"
    archRoomVersion = "1.0.0-alpha1"
}

allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://maven.google.com' }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

第二个:

apply plugin: 'com.android.application'

android {
compileSdkVersion 26
defaultConfig {
    applicationId "com.example.fabian.kohlmannkonstruktionen"
    minSdkVersion 15
    targetSdkVersion 26
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner 
"android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 
'proguard-rules.pro'
    }
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-
core:3.0.1'
compile 'android.arch.persistence.room:runtime:' + 
rootProject.archRoomVersion
annotationProcessor 'android.arch.persistence.room:compiler:' + 
rootProject.archRoomVersion

}

MainActivity.java

package com.example.fabian.kohlmannkonstruktionen;

import android.app.AlertDialog;
import android.content.DialogInterface;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.arch.persistence.db.SupportSQLiteDatabase;
import android.arch.persistence.room.Database;
import android.arch.persistence.room.Room;
import android.arch.persistence.room.RoomDatabase;
import android.arch.persistence.room.migration.Migration;
import android.content.Context;


public class MainActivity extends AppCompatActivity {

AppDatabase db;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    db = AppDatabase.getInMemoryDatabase(getApplicationContext());
}
...

AppDatabase.java

package com.example.fabian.kohlmannkonstruktionen;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.arch.persistence.db.SupportSQLiteDatabase;
import android.arch.persistence.room.Database;
import android.arch.persistence.room.Room;
import android.arch.persistence.room.RoomDatabase;
import android.arch.persistence.room.migration.Migration;
import android.content.Context;


public class MainActivity extends AppCompatActivity {
    AppDatabase db;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        db = AppDatabase.getInMemoryDatabase(getApplicationContext());
}

项目.java

import android.arch.persistence.room.Entity;
import android.arch.persistence.room.PrimaryKey;

/**
 * Created by Fabian on 14.11.2017.
 */
@Entity
public class Projekt {
    @PrimaryKey(autoGenerate = true)
    Integer id;

    Integer projektnummer;
    Integer lohn,arbeitszeit;
    String projektname, firma;
    Boolean abgeschlossen;
    public Projekt(String projektname,String firma,Integer projektnummer){
        this.abgeschlossen=false;
        this.projektname=projektname;
        this.projektnummer=projektnummer;
        this.firma=firma;
    }
...getters and setters...

ProjektDao.java

import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Delete;
import android.arch.persistence.room.Insert;
import android.arch.persistence.room.Query;

import java.util.List;

/**
 * Created by Fabian on 15.11.2017.
 */
@Dao
public interface ProjektDao {
    @Query("SELECT * FROM Projekt")
    List<Projekt> getAll();

    @Query("SELECT * FROM Projekt where id LIKE  :id")
    Projekt findByID(String id);

    @Query("SELECT COUNT(*) from Projekt")
    int countUsers();

    @Insert
    void insertAll(Projekt... projekts);

    @Delete
    void delete(Projekt projekt);
}

Termin 和 TerminDao 看起来一样

这是来自 gradle 控制台的文本:

Executing tasks: [assemble]

Configuration on demand is an incubating feature.
Configuration 'compile' in project ':app' is deprecated. Use 'implementation' instead.
:app:compileDebugJavaWithJavac
C:\Users\Fabian\AndroidStudioProjects\KohlmannKonstruktionen\app\src\main\java\TerminDao.java:14: warning: The query returns some columns [pausenzeit, startzeit, endzeit, lohnproh, mitarbeiter, standort] which are not use by Projekt. You can use @ColumnInfo annotation on the fields to specify the mapping. Projekt has some fields [projektnummer, lohn, arbeitszeit, projektname, firma, abgeschlossen] which are not returned by the query. If they are not supposed to be read from the result, you can mark them with @Ignore annotation. You can suppress this warning by annotating the method with @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH). Columns returned by the query: id, pausenzeit, startzeit, endzeit, lohnproh, mitarbeiter, standort. Fields in Projekt: id, projektnummer, lohn, arbeitszeit, projektname, firma, abgeschlossen.
    List<Projekt> getAll();
                  ^
C:\Users\Fabian\AndroidStudioProjects\KohlmannKonstruktionen\app\src\main\java\AppDatabase.java:13: warning: Schema export directory is not provided to the annotation processor so we cannot export the schema. You can either provide `room.schemaLocation` annotation processor argument OR set exportSchema to false.
public abstract class AppDatabase extends RoomDatabase {
                ^
C:\Users\Fabian\AndroidStudioProjects\KohlmannKonstruktionen\app\src\main\java\com\example\fabian\kohlmannkonstruktionen\MainActivity.java:13: error: cannot find symbol
    AppDatabase db = AppDatabase.getInMemoryDatabase(getApplicationContext());
    ^
  symbol:   class AppDatabase
  location: class MainActivity
1 error
2 warnings

 FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

* Get more help at https://help.gradle.org

BUILD FAILED in 5s

14 actionable tasks: 1 executed, 13 up-to-date

【问题讨论】:

  • 只需在 Application 类中导入您的 AppDatabase.java
  • 请添加您的活动代码。
  • 尝试导入AppDatabase
  • 你能把你的Entity类和dao类贴在这里吗?我已尝试使用您当前正常工作的共享代码。
  • 对不起,我刚刚读到这个 ​​cmets。首先是整个项目:1drv.ms/u/s!AnqlPFsLDSOSrUVYGXw37fyc15CL 我用代码的重要部分编辑我的问题

标签: android database android-room


【解决方案1】:

我的AppDatabase.class 和你的有点不同:

...
INSTANCE = Room.databaseBuilder(context, AppDatabase.class, "xxx")
                    // To simplify the codelab, allow queries on the main thread.
                    // Don't do this on a real app! See PersistenceBasicSample for an example.
                    .allowMainThreadQueries()
                    .build();
...

而我的build.gradle也包括lifecycle

// for room
compile 'android.arch.lifecycle:extensions:1.0.0';
compile 'android.arch.persistence.room:runtime:1.0.0';
annotationProcessor 'android.arch.lifecycle:compiler:1.0.0';
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0';

【讨论】:

  • 这也不起作用:/只是为了确定:您的 AppDatabase.class 也是抽象的?恐怕错误可能不在数据库中,而是有点愚蠢。
  • 是的,AppDatabase.class 是抽象的。
【解决方案2】:

查看我的代码可能对你有帮助。

AppDatabase.java

@Database(entities = {Product.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {

    private static AppDatabase INSTANCE;

    public abstract ProductDao productDao();

    public static AppDatabase getInMemoryDatabase(Context context) {
        if (INSTANCE == null) {
            INSTANCE =
                    Room.inMemoryDatabaseBuilder(context.getApplicationContext(), AppDatabase.class).allowMainThreadQueries().build();
        }
        return INSTANCE;
    }

    public static void destroyInstance() {
        INSTANCE = null;
    }
}

Mainactivity.java

AppDatabase db = AppDatabase.getInMemoryDatabase(getApplicationContext());

Build.Gradle(项目)

allprojects {
    repositories {
        jcenter()
        maven { url 'https://maven.google.com' }
    }
}

Build.Gradle(应用程序)

// Room
compile 'android.arch.persistence.room:runtime:1.0.0'
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'

这只会创建一个实例。这在我的代码中运行良好。

【讨论】:

  • 这看起来不错,但它仍然显示 $"Cannot resolve symbol 'AppDatabase"$ 你能告诉我你的 gradle 文件吗?也许我在上面搞砸了。而且你根本没有实现抽象类 AppDatabase?
  • 您能在此处添加您的日志吗?
  • destroyInstance() 有什么用?
  • 只是销毁数据库实例
【解决方案3】:

对我来说,这是复制/粘贴的情况。

重新键入 @PrimaryKey 等,以便 Android Studio 知道您正在使用它们,或者 IDE 只是将其视为文本

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    相关资源
    最近更新 更多