【问题标题】:SQLiteProvider / SQLiteLog Error: No such table: productsSQLiteProvider / SQLiteLog 错误:没有这样的表:产品
【发布时间】:2014-02-23 06:53:37
【问题描述】:

我开始使用novoda/SQLiteProvider 在一个全新的 Android/Gradle 项目中遵循他们的“简单”演示项目。似乎我缺少一些导致创建表的步骤/配置。这就是我最终出现此错误的原因:

SQLiteProvider  W  No constrain against URI: 
                   content://com.example.providers/products
     SQLiteLog  E  (1) no such table: products
SQLiteDatabase  E  Error inserting name=book
                E  android.database.sqlite.SQLiteException: 
                   no such table: products (code 1): , 
                   while compiling: INSERT INTO products(name) VALUES (?)

                E      at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                E      at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
                E      at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
                E      at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
                E      at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                E      at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
                E      at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
                E      at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
                E      at novoda.lib.sqliteprovider.provider.action.InsertHelper.insert(InsertHelper.java:41)
                E      at novoda.lib.sqliteprovider.provider.SQLiteContentProviderImpl.insertInTransaction(SQLiteContentProviderImpl.java:62)
                E      at novoda.lib.sqliteprovider.provider.SQLiteContentProvider.bulkInsert(SQLiteContentProvider.java:109)
                E      at android.content.ContentProvider$Transport.bulkInsert(ContentProvider.java:233)
                E      at android.content.ContentResolver.bulkInsert(ContentResolver.java:1251)
                E      at com.example.StorageHelper.store(StorageHelper.java:21)
                E      at com.example.tasks.DataTask.doInBackground(DataTask.java:38)
                E      at android.os.AsyncTask$2.call(AsyncTask.java:288)
                E      at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                E      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                E      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                E      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                E      at java.lang.Thread.run(Thread.java:841)
      dalvikvm  W  threadid=11: thread exiting with uncaught exception (group=0x416b7d40)
AndroidRuntime  E  FATAL EXCEPTION: AsyncTask #1
                E  Process: com.example, PID: 23203

                E  java.lang.RuntimeException: 
                   An error occured while executing doInBackground()
                E      at android.os.AsyncTask$3.done(AsyncTask.java:300)
                E      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
                E      at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
                E      at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                E      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                E      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                E      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                E      at java.lang.Thread.run(Thread.java:841)

                E  Caused by: android.database.SQLException: 
                   Failed to insert row into 
                   content://com.example.providers/products
                E      at novoda.lib.sqliteprovider.provider.action.InsertHelper.insert(InsertHelper.java:46)
                E      at novoda.lib.sqliteprovider.provider.SQLiteContentProviderImpl.insertInTransaction(SQLiteContentProviderImpl.java:62)
                E      at novoda.lib.sqliteprovider.provider.SQLiteContentProvider.bulkInsert(SQLiteContentProvider.java:109)
                E      at android.content.ContentProvider$Transport.bulkInsert(ContentProvider.java:233)
                E      at android.content.ContentResolver.bulkInsert(ContentResolver.java:1251)
                E      at com.example.StorageHelper.store(StorageHelper.java:21)
                E      at com.example.tasks.DataTask.doInBackground(DataTask.java:38)
                E      at android.os.AsyncTask$2.call(AsyncTask.java:288)
                E      at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                E      ... 4 more
       Process  I  Sending signal. PID: 23203 SIG: 9

这是我整理的...

// app/build.gradle
dependencies {
    compile 'com.android.support:support-v4:19.0.1'
    compile 'com.android.support:appcompat-v7:19.0.1'
    compile 'com.novoda:sqliteprovider-core:1.0.0'
}

...

// com.example.providers.ProductProvider.java
public class ProductProvider extends SQLiteContentProviderImpl {

    private static final String AUTHORITY =
            "content://com.example.providers";
    private static final String TABLE_NAME_PRODUCTS = "products";
    public static final String COL_PRODUCTS_NAME = "name";

    public static final Uri PRODUCTS =
            Uri.parse(AUTHORITY).buildUpon()
            .appendPath(TABLE_NAME_PRODUCTS).build();
}

...

<!-- AndroidManifest.xml -->
<application
    <provider
        android:name=".providers.ProductProvider"
        android:authorities="com.example.providers"
        android:exported="false" />
</application>  

...

// app/src/main/assets/migrations/001_setup.sql
CREATE TABLE IF NOT EXISTS 'products' (
    _id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT
);

...

Uri table = ProductProvider.PRODUCTS;
ContentValues values = new ContentValues(1);
values.put(ProductProvider.COL_PRODUCTS_NAME, "book");
getActivity().getContentResolver().insert(table, values);

【问题讨论】:

  • 您使用的是什么版本的 SQLiteProvider?您是否确保您卸载了任何旧的 APK(全新安装将正确地为您重新创建数据库)。从迁移文件名中删除前导零,即 1_ 而不是 001_
  • @Blundell 我将版本添加到问题中:v.1.0.0。是的,APK 是全新安装到设备上的。我在运行 gradle 之前删除了 ~/.gradle/caches/modules-2/files-2.1/com.novoda/sqliteprovider-core-1.0.0.jar 会重新下载。 SQL 文件的文件名中没有前导零没有区别。仍然失败。

标签: android android-sqlite android-contentprovider create-table sqliteopenhelper


【解决方案1】:

我认为 1.0.0 版不支持多行 SQL。

两个选项,更改你的迁移文件:

// app/src/main/assets/migrations/001_setup.sql

CREATE TABLE IF NOT EXISTS 'products' (_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT);

或使用最新的快照版本:

 compile 'com.novoda:sqliteprovider-core:1.0.1-SNAPSHOT'

最新版本现已发布,不再快照

 compile 'com.novoda:sqliteprovider-core:1.0.1'

【讨论】:

  • 哇。您绝对应该在项目页面上提及这一点。否则这将需要很长时间才能弄清楚。非常感谢。
  • 我今天会发布 1.0.1 版本
  • 不错。仍然非常欢迎CHANGELOG 或 GitHub 发布说明。
  • 是的,我们需要添加一个 ChangeLog 好点! @JJD v1.0.1 现已发布,可在 novoda/public-mvn-repo 获取
  • 这意味着您创建的表没有唯一字段,因此您可能会尝试创建两行可能完全相同的数据,这是很危险的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 2012-08-19
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多