38

GPU イメージ Android ライブラリでSugar ORMを使用しているときに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)
4

21 に答える 21

95

私は同じ問題を抱えていました.Instant Runに関連しています。Instant Run を無効にし、アプリケーションを再インストールすると、機能します。

Instant Run を有効または無効にする方法の詳細については、このリンクを参照してください。

于 2016-04-07T14:04:24.770 に答える
6

モデル テーブルを作成するには、アプリケーションの起動後にすべてのモデルに対してこれを実行します。

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

私のアプリケーションは SugarApp を拡張するため、Sugar はすべてのテーブルを作成する必要があります。

一方、データベースを更新するには、バージョンを 2 に変更する必要があります。

最後に、空のコンストラクタを持つことは必須です。

お役に立てれば!;)

于 2015-10-12T14:23:49.940 に答える
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

バージョンを 2 に変更しようとしましたか??? これは異なるバージョンである可能性があります。他の値も試してください。

また、SugarRecord クラスに空のコンストラクターがあることを確認してください。

使用している場合はデータベース名を変更してください。別のアプローチです。

アプリをアンインストールせずにテーブルを作成する場合は、バージョン番号を+1にしてください。

于 2015-10-09T11:29:29.477 に答える
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を使用してログに記録してください。

于 2016-01-31T17:21:05.887 に答える