Android:Sugar ORM没有这样的表格例外

时间:2015-10-09 06:43:36

标签: android sqlite gpuimage sugarorm

当我使用Sugar ORMGPU image Android Library时,我收到No Such table例外。我正在使用Gradle和Android Studio。一旦我删除GPU图像这个问题就解决了。所以我不知道什么导致这个例外。有关此例外的详细信息也在此git issue中讨论 似乎很多人还在面对它。

我的崩溃日志发布在

下面
> 10-09 11:30:21.511 4326-4831/com.example.app E/SQLiteLog: (10) Failed
> to do file read, got: 0, amt: 100, last Errno: 2 10-09 11:30:26.506
> 4326-4831/com.example.app E/SQLiteLog: (1) no such table: IMAGE 10-09
> 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: FATAL
> EXCEPTION: AsyncTask #1 10-09 11:30:26.516 4326-4831/com.example.app
> E/AndroidRuntime: java.lang.RuntimeException: An error occured while
> executing doInBackground() 10-09 11:30:26.516
> 4326-4831/com.example.app E/AndroidRuntime:     at
> android.os.AsyncTask$3.done(AsyncTask.java:299) 10-09 11:30:26.516
> 4326-4831/com.example.app E/AndroidRuntime:     at
> java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> java.util.concurrent.FutureTask.setException(FutureTask.java:219)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> java.util.concurrent.FutureTask.run(FutureTask.java:239) 10-09
> 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 10-09
> 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> java.lang.Thread.run(Thread.java:838) 10-09 11:30:26.516
> 4326-4831/com.example.app E/AndroidRuntime:  Caused by:
> android.database.sqlite.SQLiteException: no such table: IMAGE (code
> 1): , while compiling: SELECT * FROM IMAGE 10-09 11:30:26.516
> 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native
> Method) 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:
> at
> android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:886)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:497)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) 10-09
> 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)
> 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime:     at
> android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1238)

21 个答案:

答案 0 :(得分:93)

我遇到了同样的问题,它与Instant Run有关。禁用即时运行,重新安装应用程序,它可以正常运行。

有关如何启用或停用即时运行的详细信息,请参阅this link

答案 1 :(得分:66)

如果您使用的是Android Studio 2.0

有同样的问题!

因此即时运行与Sugar ORM不兼容

  • 打开设置
  • enter image description here
  • 现在运行您的项目

享受!

答案 2 :(得分:30)

我遇到了同样的问题。禁用“即时运行”并没有解决问题。我也没有启用proguard。后来我从android清单中删除了所有的sugarORM元数据(查询日志除外),解决了这个问题。所以从android manifest中删除以下3行:

    <meta-data android:name="DATABASE" android:value="edikodik.db" />
    <meta-data android:name="VERSION" android:value="2" />
    <meta-data android:name="QUERY_LOG" android:value="true" /> 

修改 根据jrhamza的评论,如果上述解决方案不起作用,请尝试禁用Instant Run。

答案 3 :(得分:15)

我使用的是1.5版本,并尝试了许多方法但不起作用。

我找到了解决方案!

这将强制在启动应用程序时创建表格:

public class SugarOrmTestApplication extends SugarApp {
    @Override
    public void onCreate() {
        super.onCreate();
        SugarContext.init(getApplicationContext());

        // create table if not exists
        SchemaGenerator schemaGenerator = new SchemaGenerator(this);
        schemaGenerator.createDatabase(new SugarDb(this).getDB());
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
        SugarContext.terminate();
    }
}

答案 4 :(得分:13)

如果在代码中添加新模型(新表),则需要在Manifest文件中更改数据库版本。新值&gt;旧值(更新)

 <meta-data
            android:name="VERSION"
            android:value="1"/>

答案 5 :(得分:10)

我也遇到过这个问题。在猎杀了2天之后,我通过以下技巧解决了它在android studio中

步骤1.在app的build.gradle文件中的依赖项中编写 compile'c​​om.github.satyan:sugar:1.5'

步骤2.在项目的build.gradle文件的依赖项中编写 classpath'com.android.tools.build:gradle:2.1.0'

步骤3.数据库版本应大于1,始终如sugarORM

中所述

答案 6 :(得分:8)

禁用您的即时运行转到 文件&gt;设置&gt;构建,执行,部署&gt;即时运行

答案 7 :(得分:6)

要创建模型表,我会在应用程序启动后用于为我的所有模型执行此操作:

Book.findById(Book.class, (long) 1);
Car.findById(Car.class, (long) 1);

我的应用程序扩展了SugarApp,因此这会强制Sugar创建所有表。

另一方面,要更新数据库,您必须将版本更改为2。

最后,拥有一个空的构造函数是必须的。

希望这有帮助! ;)

答案 8 :(得分:6)

解决

我不知道但是没有调用SugarDb.onCreate。因此,将此代码放在MainActivity.onCreate中,Sugar ORM将起作用

    SugarDb db = new SugarDb(this);
    db.onCreate(db.getDB());

答案 9 :(得分:5)

在我的情况下,我从AndroidManifest.xml中删除了以下行,它可以正常工作!

enter image description here

答案 10 :(得分:4)

我也有这个问题,我的班级只有1个String属性。我使用的是1.3版。只需从 AndroidManifest.xml 文件中评论此代码,您就可以了:)

<meta-data
 android:name="DOMAIN_PACKAGE_NAME"
 android:value="com.project.database.entities" />

<强>参考:

  

https://github.com/satyan/sugar/issues/75

答案 11 :(得分:4)

我有这个问题。我执行了这里发布的所有建议。但都没有奏效。然后我把所有的一起应用,最后摆脱了那个问题。我做了什么 -

1. Disabled instant run. (as Parth Vora said.)
2. Then I added the following class-

   import android.app.Application;
   import android.content.res.Configuration;
   import com.orm.SugarApp;
   import com.orm.SugarContext;

   public class SugarOrmTestApplication extends SugarApp {

      @Override
      public void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
      }

      @Override
     public void onCreate() {
        super.onCreate();
        SugarContext.init(getApplicationContext());
        Book.findById(Book.class, (long) 1);
     }

     @Override
     public void onLowMemory() {
       super.onLowMemory();
     }

     @Override
     public void onTerminate() {
       super.onTerminate();
     }
 }

 3. Modified manifest file-
    <application
      //Added the following lines-
       android:name="SugarOrmTestApplication">
       <meta-data android:name="DATABASE" android:value="sugar_example_new.db" />
       <meta-data android:name="VERSION" android:value="2" />
       <meta-data android:name="QUERY_LOG" android:value="true" />
    </application>

这是我的模特课 -

public class Book extends SugarRecord {
   String title;
   String edition;

   public Book(){
   }

   public Book(String title, String edition){
      this.title = title;
      this.edition = edition;
   }
}

现在我的应用程序运行良好。

答案 12 :(得分:2)

您是否尝试将版本更改为2 ???这可能是不同的版本,也可以尝试其他值。

另外,请确保SugarRecord类上有空构造函数。

如果您正在使用,则更改数据库名称是另一个approuche。

如果您在不取消应用的情况下创建表格,请将版本号设为+1。

答案 13 :(得分:2)

正如其他人所说,Android Studio即时运行可能是问题(known SugarORM issue),请尝试将其关闭。

但是,我遇到了同样的问题,这对我来说还不够,问题依然存在。我通过将清单中的allowBackup="true"更改为false,运行应用并删除&gt;来解决此问题。之后重新安装应用程序。

为什么我猜这就是问题所在:我发现即使重新安装后我的偏好也会保存。如果这也发生在损坏的SQL表中(由于即时运行),那么即使重新安装也无法修复它。将allowBackup更改为false并重新安装后,我的问题立即得到解决。我还没有能够重现错误,所以也无法重现修复。

希望这样的补充可以帮助像我这样的头痛的人!

答案 14 :(得分:1)

我遇到了同样的问题并解决了这个问题,不是通过禁用即时运行而是通过更改我的:

<meta-data android:name="VERSION" android:value="1" />

<meta-data android:name="VERSION" android:value="2" />

由于最低值应为2

答案 15 :(得分:1)

对我来说问题是,在我的应用程序中,我有两个不同的数据库。所以,我只将版本1改为版本2.我的第一个DB有版本1

答案 16 :(得分:1)

确保元数据包名称指向您放置模型实体而不是应用程序包名称

的位置

答案 17 :(得分:1)

当您开始初始开发并且不希望为模型的快速迭代期间所做的更改而增加数据库版本时(我在充实无法预料的要求时会做很多事情),请在此期间使用您的应用程序启动:

SugarDb sugarDb = new SugarDb(getApplicationContext());
new File(sugarDb.getDB().getPath()).delete();
Model.findById(Model.class, (long) 1); // Perform this for each SugarRecord  model

// Insert test data:
Modelrecord = new Model("Model Title", "Model content", false);
record.save();

警告 - 这将删除数据库中的所有数据,因此调试会话之间的持久更改将无法正常工作,但它确实允许您发布数据库的应用版本1的版本1。

我不建议在版本1正式发布后执行此操作,请确保使用SugarORM Migration Method记录所需的所有更改。

答案 18 :(得分:0)

在我的情况下,它是库糖的问题。它有获取域类的错误方法(com.orm.util.ReflectionUtil#getDomainClasses)。该方法始终不返回任何类。所以Sugar可能不会初始化数据库表。我已经降级为gradle 1.3.0(该方法正常工作)并且问题已经消失。

答案 19 :(得分:0)

如github repo的README中所述,如果您使用的是proguard,则应确保实体保持未混淆状态,以便正确命名表和列。

为此,请将此行添加到proguard-rules.pro

-keep class com.yourpackage.yourapp.domainclasspackage.** { *; }

答案 20 :(得分:0)

请检查此属性

    <`meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="trending.hashtags.pojo" />`

这应该恰好是您的POJO类不仅是包名称的地方。