No Such table
Sugar ORM with GPU image Android Library を使用している場合の例外。GradleとAndroidスタジオ。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)
私は同じ問題を抱えていました。それはインスタントランに関連しています。インスタントランを無効にし、アプリケーションを再インストールすると動作します。
Instant Runを有効または無効にする方法の詳細については、 このリンク を参照してください。
私は同じ問題に直面していました。 「インスタントラン」を無効にしても問題は解決しませんでした。私もプロガードを有効にしませんでした。後で、Androidマニフェスト(クエリログを除く)からsugarORMのすべてのメタデータを削除し、問題を解決しました。したがって、Android manifest:
<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のコメントによると、上記の解決策が機能しない場合は、インスタントランを無効にしてみてください。
私はバージョン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();
}
}
コードに新しいモデル(新しいテーブル)を追加する場合、マニフェストファイルのデータベースのバージョンを変更する必要があります。新しい値>古い値(更新)
<meta-data
Android:name="VERSION"
Android:value="1"/>
私もこの問題に直面しました。 2日間狩りをした後、In Android studio
ステップ1.アプリのbuild.gradleファイルの依存関係にcompile 'com.github.satyan:sugar:1.5'を記述します
ステップ2.プロジェクトのbuild.gradleファイルの依存関係にclasspath 'com.Android.tools.build:gradle:2.1.0'を記述します
ステップ3. DBバージョンは、sugarORMで文書化されているように常に1より大きくなければなりません
インスタント実行を無効にする[ファイル]> [設定]> [ビルド、実行、展開]> [インスタント実行]に移動します
解決済み
わかりませんが、SugarDb.onCreateは呼び出されません。したがって、このコードをMainActivity.onCreateに配置すると、Sugar ORMが機能します
SugarDb db = new SugarDb(this);
db.onCreate(db.getDB());
モデルテーブルを作成するには、アプリケーションが起動したら、すべてのモデルに対してこれを実行します。
Book.findById(Book.class, (long) 1);
Car.findById(Car.class, (long) 1);
私のアプリケーションはSugarAppを拡張するため、これによりSugarはすべてのテーブルを作成する必要があります。
一方、データベースを更新するには、バージョンを2に変更する必要があります。
そして最後に、空のコンストラクターを持つことは必須です。
お役に立てれば! ;)
この問題がありました。ここに投稿されたすべての提案を実行しました。しかし、どちらも機能しませんでした。それから私はすべて一緒に適用し、最終的にその問題を取り除きました。私がしたこと-
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;
}
}
これで私のアプリケーションは正常に動作します。
私もこの問題を抱えていました。私のクラスにはStringプロパティが1つしかありませんでした。バージョン1.3を使用していました。 AndroidManifest.xmlファイルからこのコードをコメントするだけでいいのです:)
<meta-data
Android:name="DOMAIN_PACKAGE_NAME"
Android:value="com.project.database.entities" />
参照:
バージョンを2に変更しようとしましたか?これは異なるバージョンである可能性があり、他の値も試してください。
また、SugarRecordクラスに空のコンストラクターがあることを確認してください。
あなたが使用している場合は、データベース名を変更し、別のアプローチです。
アプリをインストールせずにテーブルを作成する場合は、バージョン番号を+1にしてください。
私は同じ問題を抱えていたので、インスタントランを無効にするのではなく、次を変更して解決しました。
<meta-data Android:name="VERSION" Android:value="1" />
に
<meta-data Android:name="VERSION" Android:value="2" />
最低値は2である必要があるため
他の人が述べたように、Android Studioインスタントランが問題である可能性があります( SugarORMの既知の問題 )、オフにしてみてください。
しかし、私は同じ問題を抱えており、それだけでは十分ではありませんでした。問題は続きました。これを修正するには、マニフェストのallowBackup="true"
をfalse
に変更し、アプリを実行し、その後アプリを削除>再インストールします。
それが問題だと思う理由:再インストール後も設定が保存されていることがわかりました。これが破損したSQLテーブルでも発生する場合(インスタントランのため)、再インストールしても修正されません。 allowBackupをfalseに変更して再インストールすると、私の問題はすぐに修正されました。私はまだエラーを再現できませんので、修正も再現できません。
この追加が私のような頭痛からだれでも助けるかもしれないことを望みます!
私にとってこの問題は、私のアプリには2つの異なるデータベースがありました。そのため、バージョン1からバージョン2に変更しただけです。最初のDBにはバージョン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 を使用して、必要なすべての変更を必ずログに記録してください。
このプロパティを確認してください
<`meta-data Android:name="DOMAIN_PACKAGE_NAME" Android:value="trending.hashtags.pojo" />`
これは、POJOクラスがパッケージ名だけではない場所である必要があります。
GithubリポジトリのREADMEに記載されているように、proguardを使用している場合は、エンティティが難読化されないようにして、テーブルと列に正しい名前を付ける必要があります。
これを行うには、次の行をproguard-rules.pro
に追加します。
-keep class com.yourpackage.yourapp.domainclasspackage.** { *; }
私の場合、それはSugarライブラリの問題です。ドメインクラス(com.orm.util.ReflectionUtil#getDomainClasses)を取得する方法が不適切です。このメソッドは常にクラスを返しません。したがって、Sugarはデータベーステーブルを初期化しない場合があります。私はgradle 1.3.0にダウングレードしました(その方法は正しく動作します)、問題はなくなりました。