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

当我使用Sugar ORM与GPU图像Android库时,我得到No Such tableexception。 我正在使用Gradle和Android Studio。 一旦我删除GPU图像,这个问题就解决了。 所以我不知道是什么导致这个exception。 关于这个exception的细节也在这个git的问题中讨论,似乎很多人仍然面临着这个问题。

我的崩溃日志张贴在下面

 > 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) 

Solutions Collecting From Web of "Android:Sugar ORM没有这样的表格例外"

我有同样的问题,这与Instant Run有关。 禁用即时运行,它的工作原理

如果你正在使用Android Studio 2.0

有同样的问题!

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

  • 开放设置
  • 在这里输入图像说明
  • 现在运行你的项目

请享用!

我面临同样的问题。 禁用“即时运行”并不能解决问题。 我也没有启用proguard。 后来我从Android清单(查询日志除外)中删除了sugarORM的所有元数据,并解决了这个问题。 所以从Android清单中删除以下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评论,如果上述解决scheme不起作用,请尝试禁用即时运行。

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

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

我也面临这个问题。 追捕2天后,我通过以下技巧解决了它在android studio中

第1步。编写应用程序的build.gradle文件中的编译“com.github.satyan:sugar:1.5”

第2步。在项目的build.gradle文件的依赖项中编写classpath“com.android.tools.build:gradle:2.1.0”

第3步。数据库版本应该总是大于1,如在sugarORM中logging的

我正在使用1.5版,并尝试了很多方法,但没有工作。

我find了解决scheme!

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

 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(); } } 

为了创build模型表格,一旦我的应用程序启动,我就可以对所有模型执行此操作:

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

我的应用程序扩展了SugarApp,所以这迫使Sugar创build所有表。

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

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

希望这可以帮助! ;)

我也有这个问题,我的课只有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

我有这个问题。 我执行这里发布的所有build议。 但是都没有工作。 然后我全部套用,最后摆脱了这个问题。 我做了什么-

 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; } } 

现在我的应用程序很好。

解决

我不知道,但没有调用SugarDb.onCreate。 所以把这段代码放在MainActivity.onCreate中,Sugar ORM将会工作

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

你有没有尝试将版本更改为2? 这可能是不同的版本,请尝试其他值。

另外,确保你的SugarRecord类有空的构造函数。

如果你正在使用,更改数据库名称然后是另一个Approuche。

如果您正在创build表格而不打开应用程序,请input版本号+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(); 

被警告 – 这将删除数据库中的所有数据,因此debugging会话之间的持续更改将不起作用,但它允许您发布数据库版本1的版本1。

在版本1正式发布后,我不build议您这样做,确保使用SugarORM迁移方法logging所有需要的更改。

正如在github repo的README中所述,如果您使用的是proguard,则应确保实体保持未被模糊处理,以便正确命名表和列。

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

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

在我的情况下,这是图书馆糖的问题。 获取域类(com.orm.util.ReflectionUtil#getDomainClasses)的方法不好。 该方法总是返回没有类。 所以Sugar可能不会初始化数据库表。 我已经降级到gradle 1.3.0(该方法正常工作),问题消失了。

确保元数据包名称指向你已经把你的模型实体没有应用程序包名称

我有同样的问题,解决了它不是通过禁用即时运行,但通过改变我的:

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

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

由于最低值应该是2

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

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

不过,我也有同样的问题,这对我来说还不够,问题依然存在。 我通过将我的清单中的allowBackup="true"更改为false ,运行该应用程序并删除>之后重新安装ap来解决此问题。

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

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

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

在这里输入图像说明