wuzg1020 2016-07-15 10:48 采纳率: 5.6%
浏览 1063
已采纳

ContentResolver无法对定义的ContentProvider进行数据操纵?

ContentResolver这边的代码:

package com.example.providertest;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
private String newId;//声明请求方ContentResolver请求的内容uri的id字段

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button addData=(Button)findViewById(R.id.add_data);
    addData.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Uri uri=Uri.parse("content://com.example.databasetest.provider/book");
            ContentValues values=new ContentValues();
            values.put("name", "A Clash of Kings");
            values.put("author", "George Martin");
            values.put("pages",1040);
            values.put("price", 22.85);
            Uri newUri=getContentResolver().insert(uri, values);
            newId=newUri.getPathSegments().get(1);
        }
    });
    Button queryData=(Button)findViewById(R.id.query_data);
    queryData.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Uri uri=Uri.parse("content://com.example.databasetest.provider/book");
            Cursor cursor=getContentResolver().query(uri, null, null, null, null);
            if(cursor != null){
                while(cursor.moveToNext()){
                    String name=cursor.getString(cursor.getColumnIndex("name"));
                    String author=cursor.getString(cursor.getColumnIndex("author"));
                    int pages=cursor.getInt(cursor.getColumnIndex("pages"));
                    double price=cursor.getDouble(cursor.getColumnIndex("price"));
                    Log.d("MainActivity","book name is"+name);
                    Log.d("MainActivity","book author is"+author);
                    Log.d("MainActivity","book pages is"+pages);
                    Log.d("MainActivity","book price is"+price);
                }
                cursor.close();
            }

        }
    });

    Button updateData=(Button)findViewById(R.id.update_data);
    updateData.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Uri uri=Uri.parse("content://com.example.databasetest.provider/book/"+newId);
            ContentValues values=new ContentValues();
            values.put("name", "A Storm of Swords");
            values.put("pages", 1216);
            values.put("price", 24.05);
            getContentResolver().update(uri, values, null, null);


        }
    });

    Button deleteData=(Button)findViewById(R.id.delete_data);
    deleteData.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Uri uri=Uri.parse("content://com.example.databasetest.provider/book/"+newId);
            getContentResolver().delete(uri, null, null);

        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;

}

}

ContentProvider这边代码:

package com.example.databasetest;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

public class DatabaseProvider extends ContentProvider {

public static final int BOOK_DIR=0;
public static final int BOOK_ITEM=1;
public static final int CATEGORY_DIR=2;
public static final int CATEGORY_ITEM=3;
public static final String AUTHORITY="com.example.databasetest.provider";
private static UriMatcher uriMatcher;
private MyDatabaseHelper dbHelper;
static{
    uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
    uriMatcher.addURI(AUTHORITY, "book", BOOK_DIR);
    uriMatcher.addURI(AUTHORITY, "book/#", BOOK_ITEM);
    uriMatcher.addURI(AUTHORITY, "category", CATEGORY_DIR);
    uriMatcher.addURI(AUTHORITY, "category/#", CATEGORY_ITEM);
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
    // TODO Auto-generated method stub
    SQLiteDatabase db=dbHelper.getWritableDatabase();
    int deletedRows=0;
    switch(uriMatcher.match(uri)){
    case BOOK_DIR:
        deletedRows=db.delete("book", selection, selectionArgs);
        break;
    case BOOK_ITEM:
        String bookId=uri.getPathSegments().get(1);
        deletedRows=db.delete("book", "id=?",new String[]{bookId});
        break;
    case CATEGORY_DIR:
        deletedRows=db.delete("Category", selection, selectionArgs);
        break;
    case CATEGORY_ITEM:
        String categoryId=uri.getPathSegments().get(1);
        deletedRows=db.delete("Category", "id=?",new String[]{categoryId});
        break;
        default:
            break;


    }
    return deletedRows;



}

@Override
public String getType(Uri uri) {
    // TODO Auto-generated method stub
    switch(uriMatcher.match(uri)){
    case BOOK_DIR:
    return "vnd.android.cursor.dir/vnd.com.example.databasetest.provider.book";
    case BOOK_ITEM:
    return "vnd.android.cursor.item/vnd.com.example.databasetest.provider.book";
    case CATEGORY_DIR:
    return "vnd.android.cursor.dir/vnd.com.example.databasetest.provider.category";
    case CATEGORY_ITEM:
    return "vnd.android.cursor.item/vnd.com.example.databasetest.provider.category";

    }
    return null;
}

@Override
public Uri insert(Uri uri, ContentValues values) {
    // TODO Auto-generated method stub
    SQLiteDatabase db=dbHelper.getWritableDatabase();
    Uri uriReturn=null;
    switch(uriMatcher.match(uri)){
    case BOOK_DIR:
    case BOOK_ITEM:

    long newBookId=db.insert("book", null, values);//返回值是新添加的那一行的ID
    uriReturn=Uri.parse("content://"+AUTHORITY+"/book/"+newBookId);
    break;
    case CATEGORY_DIR:
    case CATEGORY_ITEM:
    long newCategoryId=db.insert("Category", null, values);
    uriReturn=Uri.parse("content://"+AUTHORITY+"/category/"+newCategoryId);
    break;
    default:

    }
    return uriReturn;
}

@Override
public boolean onCreate() {
    // TODO Auto-generated method stub
    dbHelper=new MyDatabaseHelper(getContext(), "BookStore.db", null, 2);
    return true;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
        String sortOrder) {
    // TODO Auto-generated method stub
    SQLiteDatabase db=dbHelper.getWritableDatabase();
    Cursor cursor=null;
    switch(uriMatcher.match(uri)){
    case BOOK_DIR:
        cursor=db.query("book",projection, selection, selectionArgs, null, null, sortOrder);

        break;
    case BOOK_ITEM:
        String bookId=uri.getPathSegments().get(1);
        cursor=db.query("book", projection, "id=?", new String[]{bookId}, null, null, sortOrder);
        break;
    case CATEGORY_DIR:
        cursor=db.query("Category",projection, selection, selectionArgs, null, null, sortOrder);

        break;
    case CATEGORY_ITEM:
        String categoryId=uri.getPathSegments().get(1);
        cursor=db.query("Category", projection, "id=?", new String[]{categoryId}, null, null, sortOrder);
        break;
        default:
            break;


    }
    return cursor;
}

@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
    // TODO Auto-generated method stub
    SQLiteDatabase db=dbHelper.getWritableDatabase();
    int updatedRows=0;
    switch(uriMatcher.match(uri)){
    case BOOK_DIR:
        updatedRows=db.update("book", values, selection, selectionArgs);
        break;
    case BOOK_ITEM:
        String bookId=uri.getPathSegments().get(1);
        updatedRows=db.update("book", values, "id=?", new String[]{bookId});
        break;
    case CATEGORY_DIR:
        updatedRows=db.update("Category", values, selection, selectionArgs);
        break;
    case CATEGORY_ITEM:
        String categoryId=uri.getPathSegments().get(1);
        updatedRows=db.update("Category", values, "id=?", new String[]{categoryId});
        break;
        default:
            break;
    }
    return updatedRows;

}

}
运行第一段程序,点击“Add to Book"按钮显示如图:
图片说明

部分LogCat信息:
图片说明
图片说明

  • 写回答

1条回答 默认 最新

  • Littlechoc 2016-07-15 11:14
    关注

    在AndroidManifest.xml中给你的provider声明了android:exported="true"没有?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?