38

No Such table当我将Sugar ORMGPU 图像 Android 库一起使用时,我遇到了异常。我正在使用 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)
4

21 回答 21

95

我有同样的问题,它与即时运行有关。禁用即时运行,重新安装应用程序,它就可以工作了。

有关如何启用或禁用 Instant Run 的详细信息,请参阅此链接。

于 2016-04-07T14:04:24.770 回答
67

如果您使用的是 Android Studio 2.0

有同样的问题!

所以即时运行与 Sugar ORM 不兼容

  • 打开设置
  • 在此处输入图像描述
  • 现在运行你的项目

享受!

于 2016-04-13T12:28:40.377 回答
31

我面临着同样的问题。禁用“即时运行”并没有解决问题。我也没有启用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。

于 2016-05-26T15:42:13.173 回答
19

我使用的是 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();
    }
}
于 2016-11-07T04:20:48.860 回答
15

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

 <meta-data
            android:name="VERSION"
            android:value="1"/>
于 2015-10-09T06:50:23.163 回答
10

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

步骤 1.在 app 的 build.gradle 文件的依赖项中写入compile 'com.github.satyan:sugar:1.5'

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

步骤 3. DB 版本应始终大于 1,如 SugarORM 中所述

于 2016-06-07T11:08:20.647 回答
8

禁用即时运行,转到文件 > 设置 > 构建、执行、部署 > 即时运行

于 2018-04-16T08:01:44.637 回答
7

解决

我不知道,但未调用 SugarDb.onCreate。所以把这段代码放在 MainActivity.onCreate 中,Sugar ORM 就可以工作了

    SugarDb db = new SugarDb(this);
    db.onCreate(db.getDB());
于 2017-07-04T11:18:36.007 回答
6

In my case, I removed the following line from AndroidManifest.xml and it works!

enter image description here

于 2017-07-17T09:14:06.170 回答
6

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

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

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

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

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

希望这可以帮助!;)

于 2015-10-12T14:23:49.940 回答
5

我也遇到了这个问题,我的班级只有 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

于 2015-12-03T08:14:08.380 回答
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;
   }
}

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

于 2016-06-02T08:00:01.090 回答
2

正如其他人所提到的,Android Studio 即时运行可能是问题(已知 SugarORM 问题),尝试将其关闭。

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

为什么我猜这是问题所在:我发现我的首选项即使在重新安装后也被保存了。如果损坏的 SQL 表也发生这种情况(由于即时运行),那么即使重新安装也无法修复它。将 allowBackup 更改为 false 并重新安装后,我的问题立即得到解决。我还无法重现该错误,因此也无法重现该修复程序。

希望这个添加可以帮助像我这样头痛的人!

于 2017-06-14T21:37:19.463 回答
2

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

此外,请确保您的 SugarRecord 类上确实有空的构造函数。

如果您正在使用更改数据库名称,那么是另一种方法。

如果您在未卸载应用程序的情况下创建表,请使版本号 +1。

于 2015-10-09T11:29:29.477 回答
2

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

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

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

因为最小值应该是 2

于 2017-03-07T09:45:21.497 回答
1

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

于 2016-07-04T15:09:57.207 回答
1

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

于 2017-04-27T10:30:01.237 回答
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 迁移方法记录所有需要的更改。

于 2016-01-31T17:21:05.887 回答
0

就我而言,这是图书馆糖的问题。获取域类(com.orm.util.ReflectionUtil#getDomainClasses)的方法很糟糕。该方法始终不返回任何类。所以 Sugar 可能不会初始化数据库表。我已降级到 gradle 1.3.0(该方法正常工作)并且问题消失了。

于 2016-04-28T11:02:49.653 回答
0

请检查此属性

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

这应该正是您的 POJO 类不仅仅是包名的地方。

于 2019-06-01T15:05:48.920 回答
0

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

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

-keep class com.yourpackage.yourapp.domainclasspackage.** { *; }
于 2016-04-02T10:48:47.633 回答