Java &引用;无效表格“;查询ContentProvider时出错

Java &引用;无效表格“;查询ContentProvider时出错,java,android,sqlite,android-contentprovider,Java,Android,Sqlite,Android Contentprovider,第二,我对android真的很陌生,还没有完全掌握它的工作方式(这似乎是我能在网上找到的大多数教程的作者的情况,所以一个好的快速而肮脏的教程也很好)。 继续这个问题,我将尝试只发布相关代码,如果我跳过了一些内容,请让我知道 舱单条目: <provider android:name="MyContentProvider" android:authorities="hua.it20910.android.provider"/> 内容提供商: private static SQLiteD

第二,我对android真的很陌生,还没有完全掌握它的工作方式(这似乎是我能在网上找到的大多数教程的作者的情况,所以一个好的快速而肮脏的教程也很好)。 继续这个问题,我将尝试只发布相关代码,如果我跳过了一些内容,请让我知道

舱单条目:

<provider android:name="MyContentProvider" android:authorities="hua.it20910.android.provider"/>
内容提供商:

private static SQLiteDatabase db;
private static final String database_name = "contactlist.db";
private static final int database_version = 1;
private static final String table1="Contacts";
private static final String[] table1_row={"_id","Surname","Name","Phone","Email","Address","Group"};
private static final String table2="Groups";
private static final String[] table2_row={"_id","Name"};

public static final String PROVIDER_NAME = "hua.it20910.android.provider";
public static final Uri CONTACTS_URI = Uri.parse("content://"+ PROVIDER_NAME + "/"+table1);
public static final Uri GROUPS_URI = Uri.parse("Content://"+PROVIDER_NAME + "/"+table2);

private static final int CONTACTS = 1;
private static final int CONTACT_ID = 2;
private static final int GROUPS = 3;
private static final int GROUP_ID = 4;

private static final UriMatcher myMatcher;
static {
    myMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    myMatcher.addURI(PROVIDER_NAME, table1, CONTACTS);
    myMatcher.addURI(PROVIDER_NAME, table1+"/#", CONTACT_ID);
    myMatcher.addURI(PROVIDER_NAME, table2, GROUPS);
    myMatcher.addURI(PROVIDER_NAME, table1+"/#", GROUP_ID);
}
private static final String table1Sql = "CREATE TABLE "
            + table1 + "(" 
            + table1_row[0] + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
            + table1_row[1] + " VARCHAR(25), "
            + table1_row[2] + " VARCHAR(25), " 
            + table1_row[3] + " INTEGER, " 
            + table1_row[4] + " VARCHAR(25), "
            + table1_row[5] + " VARCHAR(25)) ";

    private static final String table2Sql = "CREATE TABLE " 
            + table2 + "("
            + table2_row[0] + " INTEGER PRIMARY KEY AUTOINCREMENT, "
            + table2_row[1] + " VARCHAR(25))";


private class DatabaseHelper extends SQLiteOpenHelper{

    public DatabaseHelper(Context context) {
        super(context, database_name, null, database_version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(table1Sql);
        db.execSQL(table2Sql);
    }

    @Override
      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
         db.execSQL("DROP TABLE IF EXISTS "+table1 );
         db.execSQL("DROP TABLE IF EXISTS "+table2 );
         onCreate(db);
      }     
}


public static Uri getTableUri(int i){
    if (i==1){
        return CONTACTS_URI;
    }
    if (i==2){
        return GROUPS_URI;
    }
    else{
        return null;
    }
}

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder();
    switch (myMatcher.match(uri)){
        case CONTACTS:
            sqlBuilder.setTables(table1);
            break;
        case CONTACT_ID:
            sqlBuilder.setTables(table1);
            sqlBuilder.appendWhere("_id=" + uri.getPathSegments().get(1));
            break;
        case GROUPS:
            sqlBuilder.setTables(table2);
            break;
        case GROUP_ID:
            sqlBuilder.setTables(table2);
            sqlBuilder.appendWhere("_id=" + uri.getPathSegments().get(1));
            break;
        default:
            throw new SQLException("Wrong uri " + uri);
    }
    if (sortOrder == null || sortOrder == "")
        sortOrder = "_id DESC";
    Cursor c = db.query(null, projection, selection, selectionArgs, null, null, sortOrder);
    c.setNotificationUri(getContext().getContentResolver(), uri);
    return null;
}
正如标题中提到的,在执行查询时,我当前收到的错误消息是无效的表,但我已经在其他错误周围进行了大量的工作,所以我不确定我是否解决了这些错误,或者只是在它们周围走动,以便在将来再次找到它们,因此任何错误更正都将非常感谢

日志:

01-11 05:43:08.385: E/Trace(930): error opening trace file: No such file or directory (2)
01-11 05:43:08.525: I/ActivityThread(930): Pub hua.it20910.android.provider: hua.it20910.android.MyContentProvider
01-11 05:43:09.515: D/dalvikvm(930): GC_FOR_ALLOC freed 57K, 7% free 2583K/2760K, paused 191ms, total 193ms
01-11 05:43:09.515: I/dalvikvm-heap(930): Grow heap (frag case) to 3.241MB for 635812-byte allocation
01-11 05:43:09.565: D/dalvikvm(930): GC_FOR_ALLOC freed 1K, 6% free 3202K/3384K, paused 43ms, total 43ms
01-11 05:43:09.616: D/dalvikvm(930): GC_CONCURRENT freed <1K, 6% free 3214K/3384K, paused 5ms+13ms, total 52ms
01-11 05:43:09.635: D/AndroidRuntime(930): Shutting down VM
01-11 05:43:09.645: W/dalvikvm(930): threadid=1: thread exiting with uncaught exception (group=0x40a70930)
01-11 05:43:09.655: E/AndroidRuntime(930): FATAL EXCEPTION: main
01-11 05:43:09.655: E/AndroidRuntime(930): java.lang.RuntimeException: Unable to start activity ComponentInfo{hua.it20910.android/hua.it20910.android.MainActivity}: java.lang.IllegalStateException: Invalid tables
01-11 05:43:09.655: E/AndroidRuntime(930):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
01-11 05:43:09.655: E/AndroidRuntime(930):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
01-11 05:43:09.655: E/AndroidRuntime(930):  at android.app.ActivityThread.access$600(ActivityThread.java:141)
01-11 05:43:09.655: E/AndroidRuntime(930):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
01-11 05:43:09.655: E/AndroidRuntime(930):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-11 05:43:09.655: E/AndroidRuntime(930):  at android.os.Looper.loop(Looper.java:137)
01-11 05:43:09.655: E/AndroidRuntime(930):  at android.app.ActivityThread.main(ActivityThread.java:5039)
01-11 05:43:09.655: E/AndroidRuntime(930):  at java.lang.reflect.Method.invokeNative(Native Method)
01-11 05:43:09.655: E/AndroidRuntime(930):  at java.lang.reflect.Method.invoke(Method.java:511)
01-11 05:43:09.655: E/AndroidRuntime(930):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-11 05:43:09.655: E/AndroidRuntime(930):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-11 05:43:09.655: E/AndroidRuntime(930):  at dalvik.system.NativeStart.main(Native Method)
01-11 05:43:09.655: E/AndroidRuntime(930): Caused by: java.lang.IllegalStateException: Invalid tables
01-11 05:43:09.655: E/AndroidRuntime(930):  at android.database.sqlite.SQLiteDatabase.findEditTable(SQLiteDatabase.java:971)
01-11 05:43:09.655: E/AndroidRuntime(930):  at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161)
01-11 05:43:09.655: E/AndroidRuntime(930):  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)
01-11 05:43:09.655: E/AndroidRuntime(930):  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1200)
01-11 05:43:09.655: E/AndroidRuntime(930):  at hua.it20910.android.MyContentProvider.query(MyContentProvider.java:178)
01-11 05:43:09.655: E/AndroidRuntime(930):  at android.content.ContentProvider.query(ContentProvider.java:652)
01-11 05:43:09.655: E/AndroidRuntime(930):  at android.content.ContentProvider$Transport.query(ContentProvider.java:189)
01-11 05:43:09.655: E/AndroidRuntime(930):  at android.content.ContentResolver.query(ContentResolver.java:372)
01-11 05:43:09.655: E/AndroidRuntime(930):  at android.content.ContentResolver.query(ContentResolver.java:315)
01-11 05:43:09.655: E/AndroidRuntime(930):  at hua.it20910.android.MainActivity.displayRecords(MainActivity.java:31)
01-11 05:43:09.655: E/AndroidRuntime(930):  at hua.it20910.android.MainActivity.onCreate(MainActivity.java:19)
01-11 05:43:09.655: E/AndroidRuntime(930):  at android.app.Activity.performCreate(Activity.java:5104)
01-11 05:43:09.655: E/AndroidRuntime(930):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
01-11 05:43:09.655: E/AndroidRuntime(930):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
01-11 05:43:09.655: E/AndroidRuntime(930):  ... 11 more
01-11 05:43:08.385:E/Trace(930):打开跟踪文件时出错:没有这样的文件或目录(2)
01-11 05:43:08.525:I/ActivityThread(930):Pub hua.it20910.android.provider:hua.it20910.android.MyContentProvider
01-11 05:43:09.515:D/dalvikvm(930):释放57K的所有物质的GC_,7%的自由2583K/2760K,暂停191ms,总计193ms
01-11 05:43:09.515:I/dalvikvm堆(930):为635812字节分配将堆(frag案例)增长到3.241MB
01-11 05:43:09.565:D/dalvikvm(930):释放1K的所有元素的GC_,6%的自由元素3202K/3384K,暂停43ms,总计43ms
01-11 05:43:09.616:D/dalvikvm(930):GC_
正如标题中提到的,我当前收到的错误消息是
执行查询时表无效,但我已经经历了一个地狱
为了到达这里,我不确定我是否犯了其他错误
解决它们[……]

ContentProvider
query
方法中执行sqlite查询时,将
null
作为表名传递,因此获得该异常是正常的,这一行:

Cursor c = db.query(null, projection, selection, selectionArgs, null, null, sortOrder);
第一个参数是表名,必须提供有效的表名,查询才能成功。因此,根据
Uri
选择合适的表并指定有效的表名。另外,如果要完全忽略它而直接查询数据库,那么在同一查询方法中使用
SQLiteQueryBuilder
的目的是什么

关于教程,我认为您错过了最重要的一个,您甚至有一个在那里构建教程的示例

正如标题中提到的,我当前收到的错误消息是 执行查询时表无效,但我已经经历了一个地狱 为了到达这里,我不确定我是否犯了其他错误 解决它们[……]

ContentProvider
query
方法中执行sqlite查询时,将
null
作为表名传递,因此获得该异常是正常的,这一行:

Cursor c = db.query(null, projection, selection, selectionArgs, null, null, sortOrder);
第一个参数是表名,必须提供有效的表名,查询才能成功。因此,根据
Uri
选择合适的表并指定有效的表名。另外,如果要完全忽略它而直接查询数据库,那么在同一查询方法中使用
SQLiteQueryBuilder
的目的是什么


关于教程,我认为您错过了最重要的一个,您甚至有一个构建教程的示例。

请发布logcat输出,我认为您错过了一些字符串周围的“”。但是如果没有logcati,我就无法准确地判断。如果我还可以发布其他任何东西来帮助更快地解决这个问题,请告诉我。请发布logcat输出,我认为您遗漏了一些字符串周围的“”。但是没有Logcati无法准确判断如果我还可以发布任何其他东西来帮助更快地解决这个问题,请告诉我meThis很尴尬,我从querybuilder(我无法正确理解)切换到db.query,并且忘记更改参数。谢谢你的注意。(而且我一定是困极了,因为我一纠正发现还有2-3个错误非常容易修复)这让人难堪,我从querybuilder(我无法正确获得)切换到db.query,忘了更改参数。谢谢你的注意。(另外,我一定是困极了,因为我一纠正,就又发现了2-3个非常容易修复的错误)