Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java getWritableDatabase:NullPointerException上的应用程序崩溃_Java_Android_Android Contentprovider_Android Database - Fatal编程技术网

Java getWritableDatabase:NullPointerException上的应用程序崩溃

Java getWritableDatabase:NullPointerException上的应用程序崩溃,java,android,android-contentprovider,android-database,Java,Android,Android Contentprovider,Android Database,我正在尝试制作一个包含数据库的应用程序。我使用的是ContentProvider,当它试图获取WritableDatabase时,它在查询方法中崩溃。 它返回一个NullPointerException。我知道上下文不是空的,因为这似乎是造成此类问题的主要原因 以下是ContentProvider代码: package com.corvus.corvusenterprises.digimonapp; import android.content.ContentProvider; import

我正在尝试制作一个包含数据库的应用程序。我使用的是ContentProvider,当它试图获取WritableDatabase时,它在查询方法中崩溃。 它返回一个NullPointerException。我知道上下文不是空的,因为这似乎是造成此类问题的主要原因

以下是ContentProvider代码:

package com.corvus.corvusenterprises.digimonapp;

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

import java.util.Arrays;
import java.util.HashSet;

import static com.corvus.corvusenterprises.digimonapp.DBHelper.presentDigimon;

/**
 * Created by Jack on 01/05/2017.
 */

public class DigimonContentProvider extends ContentProvider {
    private static DigimonContentProvider instance;
    private DBHelper dbHelper;
    private SQLiteDatabase db;

    private static final int DIGIMON = 10;
    private static final int DIGIMON_ID = 20;
    private static final int ATTACKS = 30;
    private static final int ATTACKS_ID = 40;
    private static final int EVOLUTIONS = 50;
    private static final int EVOLUTIONS_ID = 60;

    private static final String AUTHORITY = "com.corvus.corvusenterprises.digimonapp";

    private static final String BASE_PATH_DIGIMON = "digimon";
    private static final String BASE_PATH_ATTACKS = "attacks";
    private static final String BASE_PATH_EVOLUTIONS = "evolutions";

    public static final Uri CONTENT_URI_DIGIMON = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH_DIGIMON);
    public static final Uri CONTENT_URI_ATTACKS = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH_ATTACKS);
    public static final Uri CONTENT_URI_EVOLUTIONS = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH_EVOLUTIONS);

    public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/digimon";
    public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/digimon";

    private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);

    static {
        sURIMatcher.addURI(AUTHORITY, BASE_PATH_DIGIMON, DIGIMON);
        sURIMatcher.addURI(AUTHORITY, BASE_PATH_DIGIMON + "/#", DIGIMON_ID);
        sURIMatcher.addURI(AUTHORITY, BASE_PATH_ATTACKS, ATTACKS);
        sURIMatcher.addURI(AUTHORITY, BASE_PATH_ATTACKS + "/#", ATTACKS_ID);
        sURIMatcher.addURI(AUTHORITY, BASE_PATH_EVOLUTIONS, EVOLUTIONS);
        sURIMatcher.addURI(AUTHORITY, BASE_PATH_EVOLUTIONS + "/#", EVOLUTIONS_ID);
    }

    private DigimonContentProvider()
    {

    }
    public static DigimonContentProvider getInstance() {
        if (instance == null)
            instance = new DigimonContentProvider();
        return instance;
    }
    @Override
    public boolean onCreate() {
        Context ctx = MyApp.getContext();
        dbHelper = DBHelper.getInstance(ctx);

        dbHelper.insertDigimon("Guilmon", "Guilmon", "Child/Rookie", "Virus", "Dinosaur", "TRUE","R.mipmap.guilmon.jpg");
        dbHelper.insertDigimon("Growmon", "Growlmon", "Adult/Champion", "Virus", "Bigger Dinosaur", "FALSE","R.mipmap.growmon.jpg");
        dbHelper.insertDigimon("Terriermon", "terriermon", "Child/Rookie", "Vaccine", "Dogbunny", "FALSE","R.mipmap.terriermon.jpg");
        dbHelper.insertDigimon("Galgomon", "Gargomon", "Adult/Champion", "Vaccine", "Gunbunny", "FALSE","R.mipmap.galgomon.jpg");
        dbHelper.insertDigimon("Kyubimon", "Kyubimon", "Adult/Champion", "Data", "9-Tailed Fox", "FALSE","R.mipmap.kyubimon.jpg");
        dbHelper.insertDigimon("Taomon", "Taomon", "Perfect/Ultimate", "Data", "Kitsune Miko", "FALSE","R.mipmap.taomon.jpg");
        dbHelper.insertDigimon("Impmon", "Impmon", "Child/Rookie", "Virus", "Kid in a purple onesie", "FALSE","R.mipmap.impmon.jpg");
        dbHelper.insertDigimon("Beelzebumon", "Beelzemon", "Ultimate/Mega", "Virus", "Demon Lord of Gluttony", "FALSE","R.mipmap.beelzebumon.jpg");

        presentDigimon[460]  = true; presentDigimon[454]  = true;
        presentDigimon[1019] = true; presentDigimon[374]  = true;
        presentDigimon[572]  = true; presentDigimon[1013] = true;
        presentDigimon[507]  = true; presentDigimon[100]  = true;

        dbHelper.insertEvolution("Guilmon", "Growmon", "");
        dbHelper.insertEvolution("Terriermon", "Galgomon","");
        dbHelper.insertEvolution("Kyubimon", "Taomon","");
        dbHelper.insertEvolution("Impmon", "Beelzebumon", "(Warp Evolution)");

        dbHelper.insertAttack("Fireball", "Pyro Sphere", "Guilmon", "Explosive Fireball");
        dbHelper.insertAttack("Rock Breaker", "Rock Breaker", "Guilmon", "Claw Swipe");
        dbHelper.insertAttack("Exhaust Flame", "Pyro Blaster", "Growmon", "Fire Laser");
        dbHelper.insertAttack("Plasma Blade", "Dragon Slash", "Growmon", "Forearm Blades");
        dbHelper.insertAttack("Blazing Fire", "Bunny Blast", "Terriermon", "Energy Blast");
        dbHelper.insertAttack("Petit Twister", "Terrier Tornado", "Terriermon", "Throws Tornado");
        dbHelper.insertAttack("Gatling Arm", "Gargo Laser", "Galgomon", "Fires Guns");
        dbHelper.insertAttack("Dum Dum Upper", "Bunny Pummel", "Galgomon", "Fires Guns While Punching");
        dbHelper.insertAttack("Koenryu", "Dragon Wheel", "Kyubimon", "Fire Dragon");
        dbHelper.insertAttack("Onibidama", "Fox-Tail Inferno", "Kyubimon", "Fireballs from the tails");
        dbHelper.insertAttack("Bonhitsusen", "Talisman of Light", "Taomon", "Energy Seal Laser");
        dbHelper.insertAttack("Oṃ", "Talisman Spell", "Taomon", "Makes a dome shield");
        dbHelper.insertAttack("Night of Fire", "Badaboom", "Impmon", "Mini-Fireballs");
        dbHelper.insertAttack("Pillar of Fire", "", "Impmon", "Wall of Flames");
        dbHelper.insertAttack("Double Impact", "Double Impact", "Beelzebumon", "Fires two bullets");
        dbHelper.insertAttack("Darkness Claw", "", "Beelzebumon", "Kills Leomon");
        db = dbHelper.getWritableDatabase();
        return false;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        Uri _uri = null;
        switch (sURIMatcher.match(uri)) {
            case DIGIMON:
                long _ID1 = db.insert(DigimonTable.DIGIMON_TABLE_NAME, "", values);
                if (_ID1 > 0) {
                    _uri = ContentUris.withAppendedId(CONTENT_URI_DIGIMON, _ID1);
                    MyApp.getContext().getContentResolver().notifyChange(_uri, null);
                }
                break;
            case ATTACKS:
                long _ID2 = db.insert(AttacksTable.ATTACKS_TABLE_NAME, "", values);
                if (_ID2 > 0) {
                    _uri = ContentUris.withAppendedId(CONTENT_URI_ATTACKS, _ID2);
                    MyApp.getContext().getContentResolver().notifyChange(_uri, null);
                }
                break;
            case EVOLUTIONS:
                long _ID3 = db.insert(EvolutionsTable.EVOLUTIONS_TABLE_NAME, "", values);
                if (_ID3 > 0) {
                    _uri = ContentUris.withAppendedId(CONTENT_URI_EVOLUTIONS, _ID3);
                    MyApp.getContext().getContentResolver().notifyChange(_uri, null);
                }
                break;
            default:
                throw new SQLException("Failed to insert row into " + uri);
        }
        MyApp.getContext().getContentResolver().notifyChange(uri, null);
        return _uri;
    }

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

        int uriType = sURIMatcher.match(uri);

        checkColumns(projection, uriType);

        queryBuilder.setTables(DigimonTable.DIGIMON_TABLE_NAME + ", " + EvolutionsTable.EVOLUTIONS_TABLE_NAME + ", " + AttacksTable.ATTACKS_TABLE_NAME);

        switch (uriType) {
            case DIGIMON:
                break;
            case DIGIMON_ID:
                queryBuilder.appendWhere(DigimonTable.DIGIMON_COLUMN_ID+"="+uri.getLastPathSegment());
            case ATTACKS:
                break;
            case ATTACKS_ID:
                queryBuilder.appendWhere(AttacksTable.ATTACKS_COLUMN_ID+"="+uri.getLastPathSegment());
            case EVOLUTIONS:
                break;
            case EVOLUTIONS_ID:
                queryBuilder.appendWhere(EvolutionsTable.EVOLUTIONS_COLUMN_ID+"="+uri.getLastPathSegment());
            default:
                throw new IllegalArgumentException("Unknown URI: "+ uri);
        }
        Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder);
        cursor.setNotificationUri(MyApp.getContext().getContentResolver(), uri);

        return cursor;
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        int uriType = sURIMatcher.match(uri);
        int rowsDeleted = 0;
        switch (uriType) {
            case DIGIMON:
                rowsDeleted = db.delete(DigimonTable.DIGIMON_TABLE_NAME, selection, selectionArgs);
                break;
            case DIGIMON_ID:
                String id1 = uri.getLastPathSegment();
                if (TextUtils.isEmpty(selection)) {
                    rowsDeleted = db.delete(
                            DigimonTable.DIGIMON_TABLE_NAME,
                            DigimonTable.DIGIMON_COLUMN_ID + "=" + id1,
                            null);
                } else {
                    rowsDeleted = db.delete(
                            DigimonTable.DIGIMON_TABLE_NAME,
                            DigimonTable.DIGIMON_COLUMN_ID + "=" + id1
                                    + " and " + selection,
                            selectionArgs);
                }
                break;
            case ATTACKS:
                rowsDeleted = db.delete(AttacksTable.ATTACKS_TABLE_NAME, selection, selectionArgs);
                break;
            case ATTACKS_ID:
                String id2 = uri.getLastPathSegment();
                if (TextUtils.isEmpty(selection)) {
                    rowsDeleted = db.delete(
                            AttacksTable.ATTACKS_TABLE_NAME,
                            AttacksTable.ATTACKS_COLUMN_ID + "=" + id2,
                            null);
                } else {
                    rowsDeleted = db.delete(
                            AttacksTable.ATTACKS_TABLE_NAME,
                            AttacksTable.ATTACKS_COLUMN_ID + "=" + id2
                                    + " and " + selection,
                            selectionArgs);
                }
                break;
            case EVOLUTIONS:
                rowsDeleted = db.delete(EvolutionsTable.EVOLUTIONS_TABLE_NAME, selection, selectionArgs);
                break;
            case EVOLUTIONS_ID:
                String id3 = uri.getLastPathSegment();
                if (TextUtils.isEmpty(selection)) {
                    rowsDeleted = db.delete(
                            EvolutionsTable.EVOLUTIONS_TABLE_NAME,
                            EvolutionsTable.EVOLUTIONS_COLUMN_ID + "=" + id3,
                            null);
                } else {
                    rowsDeleted = db.delete(
                            EvolutionsTable.EVOLUTIONS_TABLE_NAME,
                            EvolutionsTable.EVOLUTIONS_COLUMN_ID + "=" + id3
                                    + " and " + selection,
                            selectionArgs);
                }
                break;
            default:
                throw new IllegalArgumentException("Unknown URI: " + uri);
        }
        MyApp.getContext().getContentResolver().notifyChange(uri, null);
        return rowsDeleted;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {

        int uriType = sURIMatcher.match(uri);
        int rowsUpdated = 0;
        switch (uriType) {
            case DIGIMON:
                rowsUpdated = db.update(DigimonTable.DIGIMON_TABLE_NAME,
                        values,
                        selection,
                        selectionArgs);
                break;
            case DIGIMON_ID:
                String id1 = uri.getLastPathSegment();
                if (TextUtils.isEmpty(selection)) {
                    rowsUpdated = db.update(DigimonTable.DIGIMON_TABLE_NAME,
                            values,
                            DigimonTable.DIGIMON_COLUMN_ID + "=" + id1,
                            null);
                } else {
                    rowsUpdated = db.update(DigimonTable.DIGIMON_TABLE_NAME,
                            values,
                            DigimonTable.DIGIMON_COLUMN_ID + "=" + id1
                                    + " and "
                                    + selection,
                            selectionArgs);
                }
                break;
            case ATTACKS:
                rowsUpdated = db.update(AttacksTable.ATTACKS_TABLE_NAME,
                        values,
                        selection,
                        selectionArgs);
                break;
            case ATTACKS_ID:
                String id2 = uri.getLastPathSegment();
                if (TextUtils.isEmpty(selection)) {
                    rowsUpdated = db.update(AttacksTable.ATTACKS_TABLE_NAME,
                            values,
                            AttacksTable.ATTACKS_COLUMN_ID + "=" + id2,
                            null);
                } else {
                    rowsUpdated = db.update(AttacksTable.ATTACKS_TABLE_NAME,
                            values,
                            AttacksTable.ATTACKS_COLUMN_ID + "=" + id2
                                    + " and "
                                    + selection,
                            selectionArgs);
                }
                break;
            case EVOLUTIONS:
                rowsUpdated = db.update(EvolutionsTable.EVOLUTIONS_TABLE_NAME,
                        values,
                        selection,
                        selectionArgs);
                break;
            case EVOLUTIONS_ID:
                String id3 = uri.getLastPathSegment();
                if (TextUtils.isEmpty(selection)) {
                    rowsUpdated = db.update(EvolutionsTable.EVOLUTIONS_TABLE_NAME,
                            values,
                            EvolutionsTable.EVOLUTIONS_COLUMN_ID + "=" + id3,
                            null);
                } else {
                    rowsUpdated = db.update(EvolutionsTable.EVOLUTIONS_TABLE_NAME,
                            values,
                            EvolutionsTable.EVOLUTIONS_COLUMN_ID + "=" + id3
                                    + " and "
                                    + selection,
                            selectionArgs);
                }
                break;
            default:
                throw new IllegalArgumentException("Unknown URI: " + uri);
        }
        MyApp.getContext().getContentResolver().notifyChange(uri, null);
        return rowsUpdated;
    }
    private void checkColumns(String[] projection, int uri) {
        HashSet<String> availableColumns;
        String[] availableDigimon = { DigimonTable.DIGIMON_COLUMN_ID,
                DigimonTable.DIGIMON_COLUMN_NAME, DigimonTable.DIGIMON_COLUMN_DUB_NAME,
                DigimonTable.DIGIMON_COLUMN_LEVEL, DigimonTable.DIGIMON_COLUMN_ATTRIBUTE,
                DigimonTable.DIGIMON_COLUMN_DESCRIPTION, DigimonTable.DIGIMON_COLUMN_FAVOURITE,
                DigimonTable.DIGIMON_COLUMN_PATH};
        String[] availableAttacks = {AttacksTable.ATTACKS_COLUMN_ID, AttacksTable.ATTACKS_COLUMN_NAME,
                AttacksTable.ATTACKS_COLUMN_DUB_NAME, AttacksTable.ATTACKS_COLUMN_DIGIMON,
                AttacksTable.ATTACKS_COLUMN_DESCRIPTION};
        String[] availableEvolutions = {EvolutionsTable.EVOLUTIONS_COLUMN_ID,EvolutionsTable.EVOLUTIONS_COLUMN_FROM,
                EvolutionsTable.EVOLUTIONS_COLUMN_TO, EvolutionsTable.EVOLUTIONS_COLUMN_CONDITIONS};
        if (projection != null) {
            HashSet<String> requestedColumns = new HashSet<String>(
                    Arrays.asList(projection));
            switch(uri){
                case DIGIMON:
                case DIGIMON_ID: availableColumns = new HashSet<String>(Arrays.asList(availableDigimon));
                    break;
                case ATTACKS:
                case ATTACKS_ID: availableColumns = new HashSet<String>(Arrays.asList(availableAttacks));
                    break;
                case EVOLUTIONS:
                case EVOLUTIONS_ID: availableColumns = new HashSet<String>(Arrays.asList(availableEvolutions));
                    break;
                default: availableColumns = new HashSet<String>(Arrays.asList(availableDigimon));
            }
            // check if all columns which are requested are available
            if (!availableColumns.containsAll(requestedColumns)) {
                throw new IllegalArgumentException(
                        "Unknown columns in projection");
            }
        }
    }

    public Cursor defaultMainMenu()
    {
        Cursor cursor = MyApp.getContext().getContentResolver().query(CONTENT_URI_DIGIMON, new String[]{DigimonTable.DIGIMON_COLUMN_NAME, DigimonTable.DIGIMON_COLUMN_FAVOURITE}, null, null, DigimonTable.DIGIMON_COLUMN_NAME + " ASC");
        int dummy = cursor.getCount();
        return cursor;

    }
    public Cursor searchMenuQuery(String search)
    {
        Cursor cursor = MyApp.getContext().getContentResolver().query(CONTENT_URI_DIGIMON,new String[] {DigimonTable.DIGIMON_COLUMN_NAME,DigimonTable.DIGIMON_COLUMN_FAVOURITE},DigimonTable.DIGIMON_COLUMN_NAME+" = '?'",new String[]{search},DigimonTable.DIGIMON_COLUMN_NAME+" ASC");
        int dummy = cursor.getCount();
        return cursor;
    }
    public Cursor favouritesMenuQuery()
    {
        Cursor cursor = MyApp.getContext().getContentResolver().query(CONTENT_URI_DIGIMON,new String[] {DigimonTable.DIGIMON_COLUMN_NAME},DigimonTable.DIGIMON_COLUMN_FAVOURITE+" = true",null,DigimonTable.DIGIMON_COLUMN_NAME+" ASC");
        int dummy = cursor.getCount();
        return cursor;
    }
    public Cursor digimonProfileQuery(String name)
    {
        Cursor cursor = MyApp.getContext().getContentResolver().query(CONTENT_URI_DIGIMON,null,DigimonTable.DIGIMON_COLUMN_NAME+" = '?'",new String[]{name},null);
        int dummy = cursor.getCount();
        return cursor;
    }
    public Cursor digimonAttacksQuery(String name)
    {
        Cursor cursor = MyApp.getContext().getContentResolver().query(CONTENT_URI_ATTACKS,null,AttacksTable.ATTACKS_COLUMN_DIGIMON+" = '?'",new String[]{name},null);
        int dummy = cursor.getCount();
        return cursor;
    }
    public Cursor digimonEvolutionFromQuery(String name)
    {
        Cursor cursor = MyApp.getContext().getContentResolver().query(CONTENT_URI_EVOLUTIONS,null,EvolutionsTable.EVOLUTIONS_COLUMN_FROM+" = '?'",new String[]{name},null);
        int dummy = cursor.getCount();
        return cursor;
    }
    public Cursor digimonEvolutionToQuery(String name)
    {
        Cursor cursor = MyApp.getContext().getContentResolver().query(CONTENT_URI_EVOLUTIONS,null,EvolutionsTable.EVOLUTIONS_COLUMN_TO+" = '?'",new String[]{name},null);
        int dummy = cursor.getCount();
        return cursor;
    }
}
以下是DBHelper代码,以防有帮助:

    package com.corvus.corvusenterprises.digimonapp;

    import android.content.ContentValues;
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;

    import static com.corvus.corvusenterprises.digimonapp.DigimonContentProvider.CONTENT_URI_ATTACKS;
    import static com.corvus.corvusenterprises.digimonapp.DigimonContentProvider.CONTENT_URI_DIGIMON;
    import static com.corvus.corvusenterprises.digimonapp.DigimonContentProvider.CONTENT_URI_EVOLUTIONS;

    /**
     * Created by Jack on 01/05/2017.
     */

    public class DBHelper extends SQLiteOpenHelper {
        public static final String[]digimonArray = {
                "Gigantic array of names"};
        private static final String DATABASE_NAME = "DigimonDatabase.db";
    private static final int version = 1;
    private static DBHelper instance;
    public static boolean[]presentDigimon = new boolean[digimonArray.length];
    private DBHelper(Context context) {
        super(context, DATABASE_NAME, null, version);
    }
    public static DBHelper getInstance(Context ctx) {
        if (instance == null)
            instance = new DBHelper(ctx);
        return instance;
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        DigimonTable.onCreate(db);
        AttacksTable.onCreate(db);
        EvolutionsTable.onCreate(db);
    }
    public void onUpgrade(SQLiteDatabase db, int oldver, int newVer)
    {
        DigimonTable.onUpgrade(db,oldver,newVer);
        AttacksTable.onUpgrade(db,oldver,newVer);
        EvolutionsTable.onUpgrade(db,oldver,newVer);
    }
    public void insertDigimon(String name, String dub_name, String level, String attribute, String description, String favourite, String path)
    {
        DigimonContentProvider dcp = DigimonContentProvider.getInstance();
        ContentValues values = new ContentValues();
        values.put(DigimonTable.DIGIMON_COLUMN_NAME,name);
        values.put(DigimonTable.DIGIMON_COLUMN_DUB_NAME,dub_name);
        values.put(DigimonTable.DIGIMON_COLUMN_LEVEL,level);
        values.put(DigimonTable.DIGIMON_COLUMN_ATTRIBUTE,attribute);
        values.put(DigimonTable.DIGIMON_COLUMN_DESCRIPTION,description);
        values.put(DigimonTable.DIGIMON_COLUMN_FAVOURITE, favourite);
        values.put(DigimonTable.DIGIMON_COLUMN_PATH,path);
        dcp.insert(CONTENT_URI_DIGIMON, values);
    }
    public void insertAttack(String name, String dub_name, String digimon, String description)
    {
        DigimonContentProvider dcp = DigimonContentProvider.getInstance();
        ContentValues values = new ContentValues();
        values.put(AttacksTable.ATTACKS_COLUMN_NAME, name);
        values.put(AttacksTable.ATTACKS_COLUMN_DUB_NAME,dub_name);
        values.put(AttacksTable.ATTACKS_COLUMN_DIGIMON, digimon);
        values.put(AttacksTable.ATTACKS_COLUMN_DESCRIPTION, description);
        dcp.insert(CONTENT_URI_ATTACKS, values);
    }
    public void insertEvolution(String from, String to, String conditions)
    {
        DigimonContentProvider dcp = DigimonContentProvider.getInstance();
        ContentValues values = new ContentValues();
        values.put(EvolutionsTable.EVOLUTIONS_COLUMN_TO,to);
        values.put(EvolutionsTable.EVOLUTIONS_COLUMN_FROM,from);
        values.put(EvolutionsTable.EVOLUTIONS_COLUMN_CONDITIONS,conditions);
        dcp.insert(CONTENT_URI_EVOLUTIONS, values);
    }
}
感谢您的帮助。如果你需要更多的信息,请告诉我。 (已编辑):正在编写新版本。代码已更新。
(已编辑2):修复了递归调用可能出现的问题。

它会抛出一个
NullPointerException
,因为您正试图直接访问
ContentProvider
方法,而不是使用
ContentResolver
进行相同操作

您可以抽象在
ContentProvider
中编写的代码,以便在另一个类中访问它。这一次使用
ContentResolver
实例实现相同的功能

编辑:
可能您的问题是您的
dbHelper
不是单例,您正在通过
insert()
方法中的
dbHelper.getInstance(getContext)
创建它的另一个实例。
仅在
onCreate()
方法中尝试获取
dbHelper
的新实例,而不要在其他方法中

您可以使用以下示例:

我知道上下文不是空的

你怎么知道的
MyApp.getContext()
对我来说很奇怪

尝试将上下文提供给ContentProvider

private Context mContext;

private DigimonContentProvider(Context context)
{
    this.mContext = context;
}

private DigimonContentProvider() { }


public static DigimonContentProvider getInstance(Context context) {
    if (instance == null)
        instance = new DigimonContentProvider(context);
    return instance;
}

@Override
public boolean onCreate() {
    dbHelper = DBHelper.getInstance(this.mContext);

但是,您不需要ContentProvider来拥有数据库,因此请尝试在没有它的情况下让数据库正常工作

“应用程序在getWritableDatabase:NullPointerException时崩溃”——显然,
dbHelper
null
。我打赌
Context ctx=MyApp.getContext()
返回null,因为用于获取上下文的静态方法是错误的,这只是解决了问题。现在stacktrace看起来是这样的:
,原因是:android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)的java.lang.NullPointerException位于android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)位于com.corvus.corvusenterprises.digimonaper.DigimonContentProvider.query(DigimonContentProvider.java:126)
也不是。
DBHelper
类是一个单例类。
insert()
方法甚至不涉及
DBHelper
,错误现在出现在
onCreate()中的第62行
method。我在主要问题中添加了DBHelper代码,以防万一。我知道这一点,因为在早期版本中,如果上下文为空,我有一个if/else,它会发出一条特定消息,一旦我实现了MyApp版本,它就不再显示为问题。另外,关于在没有ContentProvider的情况下创建数据库,我已经阅读了y把它撕成碎片,然后从地上重建了两次。如果可能的话,我不想再做第三次。这只是一个建议。在尝试将ContentProvider捆绑在数据库上之前,您测试过数据库吗?而且,“DBHelper”应该是“帮助”的使用
SQLiteDatabase
对象。为什么在ContentProvider中会有一个单独浮动的对象?因此,尽管我在四个小时前尝试了这个精确的解决方案,但它失败了,最终还是出现了一些放入getContext()的排列某个地方似乎已经修复了它。不知何故。仍然有错误,但它们完全无关。谢谢!
private Context mContext;

private DigimonContentProvider(Context context)
{
    this.mContext = context;
}

private DigimonContentProvider() { }


public static DigimonContentProvider getInstance(Context context) {
    if (instance == null)
        instance = new DigimonContentProvider(context);
    return instance;
}

@Override
public boolean onCreate() {
    dbHelper = DBHelper.getInstance(this.mContext);