Android ContentProvider在插入时失败

Android ContentProvider在插入时失败,android,Android,我是为android开发的新手,遇到了一些我似乎无法绕过的绊脚石 使用记事本示例,我创建了自己的ContentProvider,以提供来自最终将托管在Web服务器上的数据库的数据。但那离我现在的位置有好几光年远 仅仅测试我的内容提供商就引起了一点头痛,我无法解决。由于某种原因,当提供程序调用SQLiteDatabase db=mopenhelp.getWritableDatabase()时我得到一个空指针异常 代码如下: MainWindow.java RulesContentProvider

我是为android开发的新手,遇到了一些我似乎无法绕过的绊脚石

使用记事本示例,我创建了自己的ContentProvider,以提供来自最终将托管在Web服务器上的数据库的数据。但那离我现在的位置有好几光年远

仅仅测试我的内容提供商就引起了一点头痛,我无法解决。由于某种原因,当提供程序调用
SQLiteDatabase db=mopenhelp.getWritableDatabase()时我得到一个空指针异常

代码如下:

MainWindow.java


RulesContentProvider.java


package com.vortex.rules;
导入android.content.ContentProvider;
导入android.content.ContentUris;
导入android.content.ContentValues;
导入android.content.Context;
导入android.content.UriMatcher;
导入android.content.res.Resources;
导入android.database.Cursor;
导入android.database.SQLException;
导入android.database.sqlite.SQLiteDatabase;
导入android.database.sqlite.SQLiteOpenHelper;
导入android.database.sqlite.SQLiteQueryBuilder;
导入android.net.Uri;
导入android.text.TextUtils;
导入android.util.Log;
导入java.util.HashMap;
导入com.vorte.rules.Rule.rules;
/**
*提供对规则数据库的访问。每个规则都有一个术语、规则本身、创建日期和修改的数据。
*@作者迈克尔·马丁
*
*/
公共类CoreRulesProvider扩展了ContentProvider{
私有静态最终字符串标记=“CoreRulesProvider”;
私有静态最终字符串数据库\u NAME=“core\u rules.db”;
私有静态最终int数据库_VERSION=2;
私有静态最终字符串规则\u TABLE\u NAME=“RULES”;
私有静态HashMap sRulesProjectionMap;
私有静态HashMap sLiveFolderProjectionMap;
私有静态最终整数规则=1;
私有静态最终整数规则_ID=2;
私有静态final int LIVE_FOLDER_RULES=3;
专用静态匹配器;
/**
*此类帮助打开、创建和升级数据库文件。
*/
私有静态类DatabaseHelper扩展了SQLiteOpenHelper{
DatabaseHelper(上下文){
super(上下文、数据库名称、null、数据库版本);
}
@凌驾
public void onCreate(SQLiteDatabase db){
db.execSQL(“创建表”+规则表名称+”(“
+规则。_ID+“整数主键,”
+Rules.TERM+文本
+Rules.TEXT+“长文本”
+ ");");
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
Log.w(标记,“将数据库从版本“+oldVersion+”升级到”
+新版本+”,将销毁所有旧数据);
db.execSQL(“如果存在删除表规则”);
onCreate(db);
}
}
/**
*DatabaseHelper类结束!!!!!
*/
私有数据库助手mOpenHelper;
@凌驾
公共布尔onCreate(){
mopenhelp=newdatabasehelper(getContext());
返回true;
}
@凌驾
公共游标查询(Uri Uri、字符串[]投影、字符串选择、字符串[]selectionArgs、字符串排序器){
SQLiteQueryBuilder qb=新的SQLiteQueryBuilder();
qb.可设置表(规则表名称);
开关(sUriMatcher.match(uri)){
案例规则:
qb.setProjectionMap(sRulesProjectionMap);
打破
案例规则\u ID:
qb.setProjectionMap(sLiveFolderProjectionMap);
qb.appendWhere(Rules._ID+“=”+uri.getPathSegments().get(1));
打破
违约:
抛出新的IllegalArgumentException(“Uknown URI”+URI);
}
//如果未指定排序顺序,则使用默认值
字符串orderBy;
if(TextUtils.isEmpty(sortOrder)){orderBy=Rules.DEFAULT\u SORT\u ORDER;
}否则{
orderBy=sortOrder;
}
//获取数据库并运行查询
SQLiteDatabase db=mopenhelp.getReadableDatabase();
游标c=qb.query(数据库、投影、选择、选择、空、空、orderBy);
//告诉游标要监视的uri,以便它知道其源数据何时更改
c、 setNotificationUri(getContext().getContentResolver(),uri);
返回c;
}
@凌驾
公共字符串getType(Uri){
开关(sUriMatcher.match(uri)){
案例规则:
案例实时\u文件夹\u规则:
返回规则.CONTENT\u类型;
案例规则\u ID:
退货规则.内容\项目\类型;
违约:
抛出新的IllegalArgumentException(“Uknown URI”+URI);
}
}
公共Uri插入(Uri、ContentValues和initialValues){
//验证请求的uri
if(sUriMatcher.match(uri)!=规则){
抛出新的IllegalArgumentException(“Uknown URI”+URI);
}
内容价值观;
如果(初始值!=null){
值=新内容值(初始值);
}否则{
values=新的ContentValues();
}
//确保所有字段都已设置
if(values.containsKey(Rules.TERM)==false){
Resources r=Resources.getSystem();
value.put(Rules.TERM,r.getString(android.r.string.untitled));
}
if(values.containsKey(Rules.TEXT)==false){
value.put(Rules.TEXT,“”);
}
SQLiteDatabase db=mOpenHelper.getWritableDatabase();
long rowId=db.insert(RULES\u TABLE\u NAME、RULES.TEXT、value);
如果(rowId>0){
Uri ruleUri=ContentUris.withAppendedId(Rules.CONTENT\u Uri,rowId);
getContext().getContentResolver().notifyChange(ruleUri,null);
返回规则URI;
}
抛出新的SQLException(“未能将行插入”+uri);
}
public int delete(Uri,字符串,其中,字符串
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    /**
     * Check for DB, if none, d/l from web server
     */
    Uri first_use = Rules.CONTENT_URI;
    ContentResolver cr = getContentResolver();
    Cursor c = cr.query(first_use, null, null, null, null);
    if(c == null){
        ContentProvider cp = new CoreRulesProvider();
        if (cp.onCreate()) {
            ContentValues values = new ContentValues();
            values.put(Rules._ID, 1);
            values.put(Rules.TERM, "Player");
            values.put(Rules.TEXT, "You, the person reading these rules, are a Player.");
                cp.insert(Rules.CONTENT_URI, values);
        }
    }
package com.vortex.rules;


import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.content.res.Resources;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;

import java.util.HashMap;

import com.vortex.rules.Rule.Rules;

/**
 * Provides access to a database of rules.  Each rule has a TERM, the RULE itself, and a creation date and modified data.
 * @author Michael Martin
 *
 */

public class CoreRulesProvider extends ContentProvider {

    private static final String TAG = "CoreRulesProvider";

    private static final String DATABASE_NAME = "core_rules.db";
    private static final int DATABASE_VERSION = 2;
    private static final String RULES_TABLE_NAME = "rules";

    private static HashMap<String, String> sRulesProjectionMap;
    private static HashMap<String, String> sLiveFolderProjectionMap;

    private static final int RULES = 1;
    private static final int RULE_ID = 2;
    private static final int LIVE_FOLDER_RULES = 3;

    private static final UriMatcher sUriMatcher;

    /**
     * This class helps open, create, and upgrade the database file.
     */
    private static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE " + RULES_TABLE_NAME + " ("
                    + Rules._ID + " INTEGER PRIMARY KEY,"
                    + Rules.TERM + " TEXT,"
                    + Rules.TEXT + " LONGTEXT"
                    + ");");
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    +newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS rules");
            onCreate(db);
        }
    }
    /**
     * END OF DatabaseHelper CLASS!!!!!
     */

    private DatabaseHelper mOpenHelper;

    @Override
    public boolean onCreate() {
        mOpenHelper = new DatabaseHelper(getContext());
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
        qb.setTables(RULES_TABLE_NAME);

        switch (sUriMatcher.match(uri)) {
        case RULES:
            qb.setProjectionMap(sRulesProjectionMap);
            break;

        case RULE_ID:
            qb.setProjectionMap(sLiveFolderProjectionMap);
            qb.appendWhere(Rules._ID + "=" + uri.getPathSegments().get(1));
            break;

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

        //If no sort order is specified, use the default
        String orderBy;
        if (TextUtils.isEmpty(sortOrder)) {orderBy = Rules.DEFAULT_SORT_ORDER;
    } else {
        orderBy = sortOrder;
    }

        //Get the database and run the query
        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
        Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);

        //Tell the cursor what uri to watch, so it knows when its source data changes
        c.setNotificationUri(getContext().getContentResolver(), uri);
        return c;
    }

    @Override
    public String getType(Uri uri) {
        switch (sUriMatcher.match(uri)) {
        case RULES:
        case LIVE_FOLDER_RULES:
            return Rules.CONTENT_TYPE;

        case RULE_ID:
            return Rules.CONTENT_ITEM_TYPE;

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

    public Uri insert(Uri uri, ContentValues initialValues) {
        //Validate the requested uri
        if (sUriMatcher.match(uri) != RULES) {
            throw new IllegalArgumentException("Uknown URI " + uri);
        }

        ContentValues values;
        if (initialValues != null) {
            values = new ContentValues(initialValues);
        } else {
            values = new ContentValues();
        }


        //Make sure that the fields are all set
        if (values.containsKey(Rules.TERM) == false) {
            Resources r = Resources.getSystem();
            values.put(Rules.TERM, r.getString(android.R.string.untitled));
        }

        if (values.containsKey(Rules.TEXT) == false) {
            values.put(Rules.TEXT, "");
        }
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        long rowId = db.insert(RULES_TABLE_NAME, Rules.TEXT, values);
        if (rowId > 0) {
            Uri ruleUri = ContentUris.withAppendedId(Rules.CONTENT_URI, rowId);
            getContext().getContentResolver().notifyChange(ruleUri, null);
            return ruleUri;
        }

        throw new SQLException("Failed to insert row into " + uri);
    }

    public int delete(Uri uri, String where, String[] whereArgs) {
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        int count;
        switch (sUriMatcher.match(uri)) {
        case RULES:
            count = db.delete(RULES_TABLE_NAME, where, whereArgs);
            break;

        case RULE_ID:
            String ruleId = uri.getPathSegments().get(1);
            count = db.delete(RULES_TABLE_NAME, Rules._ID + "=" + ruleId
                    + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""),
                    whereArgs);
            break;

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

        getContext().getContentResolver().notifyChange(uri, null);
        return count;
    }

    @Override
    public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        int count;
        switch (sUriMatcher.match(uri)) {
        case RULES:
            count = db.update(RULES_TABLE_NAME, values, where, whereArgs);
            break;

        case RULE_ID:
            String ruleId = uri.getPathSegments().get(1);
            count = db.update(RULES_TABLE_NAME, values, Rules._ID + "=" + ruleId
                    + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : "")
                    , whereArgs);
            break;
        default:
            throw new IllegalArgumentException("Unknown URI " + uri);
        }

        getContext().getContentResolver().notifyChange(uri, null);
        return count;
    }

    static {
        sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        sUriMatcher.addURI(Rule.AUTHORITY, "rules", RULES);
        sUriMatcher.addURI(Rule.AUTHORITY, "rules/#", RULE_ID);
        sUriMatcher.addURI(Rule.AUTHORITY, "live_folders/rules", LIVE_FOLDER_RULES);

        sRulesProjectionMap = new HashMap<String, String>();
        sRulesProjectionMap.put(Rules._ID, Rules._ID);
        sRulesProjectionMap.put(Rules.TERM, Rules.TERM);
        sRulesProjectionMap.put(Rules.TEXT, Rules.TEXT);
    }

}