尝试使用下面显示的自定义ContentProvider查询我的数据库时,我收到以下错误.

我已经确认该表存在正确的名称,但仍然无效.

我能够使用原始查询,但我希望我们使用ContentProvider模式进行练习.

谢谢,如果您需要更多信息,请与我们联系.

sqliteOpenHelper

public class DatabaseHelper extends sqliteOpenHelper {

    private static final String TAG = DatabaseHelper.class.getSimpleName();

    private static final String DB_PATH = 
            "/data/data/ashton.android.personal.worktc/databases/";

    private static final String DB_NAME = "worktc.db";

    private static final int DB_VERSION = 1;

    private sqliteDatabase myDatabase;

    private final Context context;

    public DatabaseHelper(Context context) {
        super(context,DB_NAME,null,DB_VERSION);
        this.context = context;
    }

    /**
     * Creates a empty database on the system and rewrites it with your own database.
     * */
    public void createDataBase() throws IOException {

        boolean dbExist = this.checkDataBase();

        if (dbExist) {
            //do nothing - database already exist
        } else {

            Log.e(TAG,"Database does not exist when trying to create it.");

            //By calling this method and empty database will be created into the default system path
            //of your application so we are gonna be able to overwrite that database with our database.
            this.getReadableDatabase();
            this.close();

            try {

                this.copyDataBase();

                Log.e(TAG,"createDatabase database created");

            } catch (IOException e) {

                throw new Error("Error copying database");

            }
        }

    }

    /**
     * Check if the database already exist to avoid re-copying the file each time you open the application.
     * @return true if it exists,false if it doesn't
     */
    private boolean checkDataBase(){

        File dbFile = new File(DB_PATH + DB_NAME);
        return dbFile.exists();

    }

    /**
     * copies your database from your local assets-folder to the just created empty database in the
     * system folder,from where it can be accessed and handled.
     * This is done by transfering bytestream.
     * */
    private void copyDataBase() throws IOException{

        //Open your local db as the input stream
        InputStream myInput = this.context.getAssets().open(DB_NAME);

        //Open the empty db as the output stream
        OutputStream myOutput = new FileOutputStream(DB_PATH + DB_NAME);

        //transfer bytes from the inputfile to the outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer))>0){
            myOutput.write(buffer,length);
        }

        //Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();

    }

    public boolean openDataBase() throws sqlException {

        //Open the database
        String myPath = DB_PATH + DB_NAME;
        this.myDatabase = sqliteDatabase.openDatabase(myPath,sqliteDatabase.CREATE_IF_NECESSARY);
        return this.myDatabase != null;
    }

    @Override
    public synchronized void close() {

        if(this.myDatabase != null)
            this.myDatabase.close();

        super.close();

    }

    @Override
    public void onCreate(sqliteDatabase db) {
        // Todo Auto-generated method stub

    }

    @Override
    public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {
        // Todo Auto-generated method stub

    }
}

内容提供商

public class WorkTCContentProvider extends ContentProvider {

    private static final String TAG = WorkTCContentProvider.class.getSimpleName();

    public static final String AUTHORITY = 
            "ashton.android.personal.worktc.database";

    private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    static {
        sURIMatcher.addURI(
                AUTHORITY,ProfessionTable.TABLE_NAME,ProfessionTable.PROFESSIONS);

        sURIMatcher.addURI(
                AUTHORITY,ProfessionTable.TABLE_NAME + "/#",ProfessionTable.PROFESSIONS_ID);
    }

    private DatabaseHelper database;

    @Override
    public int delete(Uri uri,String selection,String[] selectionArgs) {
        // Todo Auto-generated method stub
        return 0;
    }

    @Override
    public String getType(Uri uri) {
        // Todo Auto-generated method stub
        return null;
    }

    @Override
    public Uri insert(Uri uri,ContentValues values) {
        // Todo Auto-generated method stub
        return null;
    }

    @Override
    public boolean onCreate() {

        Log.d(TAG,"before database creation");

        this.database = new DatabaseHelper(getContext());
        try {
            this.database.createDataBase();
        } catch (IOException e) {
            // Todo Auto-generated catch block
            e.printstacktrace();
        }
        this.database.openDataBase();
        this.database.close();

        Log.d(TAG,"after database creation");

//      this.database.getWritableDatabase().execsql( "pragma foreign_keys = on;" );

        return false;
    }

    @Override
    public Cursor query(Uri uri,String[] projection,String[] selectionArgs,String sortOrder) {

        sqliteQueryBuilder queryBuilder = new sqliteQueryBuilder();

        switch (sURIMatcher.match(uri)) {
        case ProfessionTable.PROFESSIONS:

            /*
             * Dont do anything,just do the normal query.
             */

            break;

        case ProfessionTable.PROFESSIONS_ID:

            queryBuilder.appendWhere(ProfessionTable._ID + "=" + uri.getLastPathSegment());

            break;

        default:
            throw new IllegalArgumentException("UnkNown URI: " + uri);
        }

        sqliteDatabase db = this.database.getReadableDatabase();

        Cursor cursor = queryBuilder.query(
                db,projection,selection,selectionArgs,sortOrder);

        cursor.setNotificationUri(WorkTCApp.getContext().getContentResolver(),uri);

        return cursor;
    }

    @Override
    public int update(Uri uri,ContentValues values,String[] selectionArgs) {
        // Todo Auto-generated method stub
        return 0;
    }
}

ProfessionTable

public final class ProfessionTable implements BaseColumns {

    public static final String TABLE_NAME = "Professions";

    public static final Uri URI = 
            Uri.parse("content://" + WorkTCContentProvider.AUTHORITY + "/" + TABLE_NAME);

    public static final int PROFESSIONS = 10;

    public static final int PROFESSIONS_ID = 11;

    public static final String NAME = "name";

    public static final String ICON = "icon";

    private ProfessionTable() {}
}

错误

09-08 11:16:18.285: E/AndroidRuntime(11651): FATAL EXCEPTION: main
09-08 11:16:18.285: E/AndroidRuntime(11651): java.lang.RuntimeException: Unable to start activity ComponentInfo{ashton.android.personal.worktc/ashton.android.personal.worktc.controllers.WorkActivity}: java.lang.IllegalStateException: Invalid tables
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:1651)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.os.Looper.loop(Looper.java:130)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.app.ActivityThread.main(ActivityThread.java:3687)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at java.lang.reflect.Method.invokeNative(Native Method)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at java.lang.reflect.Method.invoke(Method.java:507)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at dalvik.system.NativeStart.main(Native Method)
09-08 11:16:18.285: E/AndroidRuntime(11651): Caused by: java.lang.IllegalStateException: Invalid tables
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.database.sqlite.sqliteDatabase.findEditTable(sqliteDatabase.java:1127)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.database.sqlite.sqliteQueryBuilder.query(sqliteQueryBuilder.java:330)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.database.sqlite.sqliteQueryBuilder.query(sqliteQueryBuilder.java:280)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at ashton.android.personal.worktc.database.worktcContentProvider.query(worktcContentProvider.java:104)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.content.ContentProvider$Transport.query(ContentProvider.java:187)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.content.ContentResolver.query(ContentResolver.java:267)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at ashton.android.personal.worktc.views.WorkView.onFinishInflate(WorkView.java:96)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:631)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.view.LayoutInflater.inflate(LayoutInflater.java:408)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.view.View.inflate(View.java:8884)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at ashton.android.personal.worktc.controllers.WorkActivity.onCreate(WorkActivity.java:30)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
09-08 11:16:18.285: E/AndroidRuntime(11651):    at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:1615)
09-08 11:16:18.285: E/AndroidRuntime(11651):    ... 11 more

解决方法

从错误:
Caused by: java.lang.IllegalStateException: Invalid tables

我注意到你没有调用setTables():

sqliteQueryBuilder queryBuilder = new sqliteQueryBuilder();
queryBuilder.setTables(ProfessionalTable.TABLE_NAME);

在尝试运行查询之前.

android – IllegalStateException:尝试使用ContentProvider查询数据库时无效的表的更多相关文章

  1. Android SQLite数据库已损坏

    此链接完全描述了我的问题:http://old.nabble.com/Android-database-corruption-td28044218.html#a28044218现在大约有300人使用我的Android应用程序,每次使用此堆栈跟踪向服务器发送崩溃报告时:结果是应用程序崩溃并且数据库中的所有数据都丢失了.需要注意的一点是,每次我读取或写入数据库时,我都会得到一个新的sqliteData

  2. android – SQLCipher – 在桌面上打开加密数据库

    我在Android上尝试使用sqlCipher.我写了一个小应用程序,在模拟器上创建了一个包含一个表和几条记录的数据库.然后,我将数据库从模拟器拉到我的桌面上.我查看了sqlCipher文档,但我无法弄清楚如何在桌面上实际解密数据库,以便查询其内容.我想确保我实际插入记录.访问记录的最简单的过程是什么?

  3. 如何在我的Android应用程序中获取SQLite数据库的URI?

    我有一个带有名为“myTestDB”的数据库的Android应用程序,其中包含一个名为“list_items”的表.我想使用CursorgetContentResolver().query()方法来获取要添加到SimpleCursorAdapter的游标.query()方法的第一个参数是一个URI,我不确定URI应该是什么样子.解决方法它是相当简单的方法调用看起来像这样mDataBase.quer

  4. 在Android上同步SQL数据库与REST远程服务器的最佳实践

    编辑:例如,采用方法2,重写的ContentProvider#bulkInsert使用数据库事务可以大大加快批量插入操作:见thisquestion.解决方法最佳选择需要适当的API实现–何时应存储一些db_version.并且在更新服务器期间响应数据和操作类型–添加,更新,删除.

  5. android – 没有SQL的ContentProvider

    我有两个数据需要从外部应用程序访问并存储.根据文档,ContentProviders是唯一可能的方式,但它也提到了外部存储.ContentProviders实现类似数据库的“接口”,对于两个数据,使用数据库是非常不必要的.我宁愿将它们保存到文件中,但是通过实现抽象方法使用ContentProvider是有问题的,因为这些方法被构造为数据库查询.我知道没有任何指定ContentProviders必须使用下面的数据库来存储数据,但有没有其他方法来存储必须共享到文件系统的最小数据量?

  6. android – 为什么我们需要onUpgrade(); SQLiteOpenHelper类中的方法

    我正在遵循这个教程可以任何身体请让我清楚这段代码.问题onUpgrade()的目的是什么;方法?重要为什么我们在这个方法中删除表并重新创建?提前致谢.解决方法onUpgrade基本上用于处理任何新版本应用程序的新数据库更改.在onUpgrade中并不总是需要删除表,这取决于您的用例.如果要求不要保留旧版本应用程序中的数据,那么drop应该会有所帮助,但是如果它更改架构那么它应该只有更改脚本.

  7. Android上的ORMLite没有调用onCreate

    使用Ormlitev4.40,我尝试让我的应用程序运行,但似乎忽略了onCreate函数我的DatabaseHelper看起来像这样(片段样式)我的MainActivity调用DatabaseHelper,如下所述:我试过重新安装应用程序,升级数据库版本,没有任何作用.我确实看到了构造函数调用(包括拼写错误:-),但onCreate和onUpgrade却没有被调用.任何帮助赞赏巴里解决方法创建Or

  8. android – 什么时候调用OnUpgrade以及它如何获取oldVersion参数?

    我正在为我当前的应用程序进行更新.我的应用程序使用sqliteDB,到目前为止我的版本1.我将需要在第二个版本中更改/引入新表.我做了我的研究,我发现要做到这一点,最好的方法是使用switch语句,在其中我以db-through方式对db进行更新.我的问题是,android如何知道onUpgrade()中的旧版本是什么?事实上,什么时候被称为?因此,对于第一次下载我更新的应用程序的用户,我认为不会调用onUpgrade()!Android如何知道何时不调用onUpgrade()?

  9. android – 如何使用AsyncTask中的SQLite DB?

    我一直在使用我的Activity类来访问我的数据库,这使我的程序有时会冻结.所以我决定使用AsyncTask来处理数据库.我的问题是我不知道如何从AsyncTask的类中实例化我的sqliteDB“TheDB”这在Activity类上运行良好,但我不知道如何在这里使用它TheDB的构造函数是TheDB,但是这个类不是“上下文”,所以我如何在这里使用我的数据库?如果可以,请提供示例请不要给我链接谷歌的参考,我是一个新手,我发现他们很难遵循解决方法你需要在这里传递应用程序上下文

  10. android – IllegalStateException:尝试使用ContentProvider查询数据库时无效的表

    尝试使用下面显示的自定义ContentProvider查询我的数据库时,我收到以下错误.我已经确认该表存在正确的名称,但仍然无效.我能够使用原始查询,但我希望我们使用ContentProvider模式进行练习.谢谢,如果您需要更多信息,请与我们联系.sqliteOpenHelper内容提供商ProfessionTable错误解决方法从错误:我注意到你没有调用setTables():在尝试运行查询之前.

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部