我确实有一个让我头疼的问题。 我通过自定义内容提供程序将我的城市的一些图像存储在sqlite数据库中。 但是,当我运行我的应用程序时,我得到一个空光标。

Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int android.database.Cursor.getCount()' on a null object reference

at theo.testing.androidcustomloaders.fragments.MainActivityFragment.onActivityCreated(MainActivityFragment.java:74)

at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:2089)

at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1133)

at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1290)

at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)

at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677)

at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:388)

at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:604)

at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:178)

at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1220)

at android.app.Activity.performStart(Activity.java:5992)

at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)

at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358)

at android.app.ActivityThread.access$800(ActivityThread.java:144)

at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)

at android.os.Handler.dispatchMessage(Handler.java:102)

at android.os.Looper.loop(Looper.java:135)

at android.app.ActivityThread.main(ActivityThread.java:5219)

at java.lang.reflect.Method.invoke(Native Method)

at java.lang.reflect.Method.invoke(Method.java:372)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)

这意味着信息未正确存储,或者我的提供商的Uri出现了问题。 所以。

我的城市合同

public class MyCityContract {

public static final String CONTENT_AUTHORITY = "theo.testing.customloaders";

public static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY);

public static final class MyCityEntry implements BaseColumns{

//table name

public static final String TABLE_MY_CITY = "my_city";

//columns

public static final String _ID = "_id";

public static final String COLUMN_NAME = "name";

public static final String COLUMN_ICON = "icon";

// create content uri

public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon()

.appendPath(TABLE_MY_CITY).build();

// create cursor of base type directory for multiple entries

public static final String CONTENT_DIR_TYPE =

ContentResolver.CURSOR_DIR_BASE_TYPE + "/" + CONTENT_AUTHORITY + "/" + TABLE_MY_CITY;

// create cursor of base type item for single entry

public static final String CONTENT_ITEM_TYPE =

ContentResolver.CURSOR_ITEM_BASE_TYPE +"/" + CONTENT_AUTHORITY + "/" + TABLE_MY_CITY;

// for building URIs on insertion

public static Uri buildFlavorsUri(long id){

return ContentUris.withAppendedId(CONTENT_URI, id);

}

}

}

MyCityDbHelper

public class MyCityDbHelper extends SQLiteOpenHelper{

public static final String LOG_TAG = MyCityDbHelper.class.getSimpleName();

//name & version

public static final String DATABASE_NAME = "city.db";

public static final int DATABASE_VERSION = 4;

// Create the database

public MyCityDbHelper(Context context) {

super(context, DATABASE_NAME,null,DATABASE_VERSION);

}

@Override

public void onCreate(SQLiteDatabase sqLiteDatabase) {

final String SQL_CREATE_MY_CITY_TABLE = "CREATE TABLE " +

MyCityContract.MyCityEntry.TABLE_MY_CITY + "(" + MyCityContract.MyCityEntry._ID +

" INTEGER PRIMARY KEY AUTOINCREMENT, " +

MyCityContract.MyCityEntry.COLUMN_NAME + " TEXT NOT NULL, " +

MyCityContract.MyCityEntry.COLUMN_ICON + " INTEGER NOT NULL);";

sqLiteDatabase.execSQL(SQL_CREATE_MY_CITY_TABLE);

}

@Override

public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {

Log.w(LOG_TAG, "Upgrading database from version " + oldVersion + " to " +

newVersion + ". OLD DATA WILL BE DESTROYED");

// Drop the table

sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + MyCityContract.MyCityEntry.TABLE_MY_CITY);

sqLiteDatabase.execSQL("DELETE FROM SQLITE_SEQUENCE WHERE NAME = '" +

MyCityContract.MyCityEntry.TABLE_MY_CITY + "'");

// re-create database

onCreate(sqLiteDatabase);

}

}

MyCityProvider

public class MyCityProvider extends ContentProvider {

private static final String LOG_TAG = MyCityProvider.class.getSimpleName();

private static final UriMatcher sUriMatcher = buildUriMatcher();

private MyCityDbHelper myCityDbHelper;

//Codes for UriMatcher

private static final int MY_CITY = 100;

private static final int MY_CITY_WITH_ID = 200;

private static UriMatcher buildUriMatcher(){

// Build a UriMatcher by adding a specific code to return based on a match

// It's common to use NO_MATCH as the code for this case.

final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);

final String authority = MyCityContract.CONTENT_AUTHORITY;

//add code for each URI

matcher.addURI(authority,MyCityContract.MyCityEntry.TABLE_MY_CITY,MY_CITY);

matcher.addURI(authority,MyCityContract.MyCityEntry.TABLE_MY_CITY + "/#",MY_CITY_WITH_ID);

return matcher;

}

@Override

public boolean onCreate() {

myCityDbHelper = new MyCityDbHelper(getContext());

return true;

}

@Override

public String getType(Uri uri) {

final int match = sUriMatcher.match(uri);

switch (match){

case MY_CITY: {

return MyCityContract.MyCityEntry.CONTENT_DIR_TYPE;

}

case MY_CITY_WITH_ID:{

return MyCityContract.MyCityEntry.CONTENT_ITEM_TYPE;

}

default:{

throw new UnsupportedOperationException("Unknown uri: " + uri);

}

}

}

@Override

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

Cursor retCursor;

switch(sUriMatcher.match(uri)){

// All Flavors selected

case MY_CITY:{

retCursor = myCityDbHelper.getReadableDatabase().query(

MyCityContract.MyCityEntry.TABLE_MY_CITY,

projection,

selection,

selectionArgs,

null,

null,

sortOrder);

return retCursor;

}

// Individual flavor based on Id selected

case MY_CITY_WITH_ID:{

retCursor = myCityDbHelper.getReadableDatabase().query(

MyCityContract.MyCityEntry.TABLE_MY_CITY,

projection,

MyCityContract.MyCityEntry._ID + " = ?",

new String[] {String.valueOf(ContentUris.parseId(uri))},

null,

null,

sortOrder);

return retCursor;

}

default:{

// By default, we assume a bad URI

throw new UnsupportedOperationException("Unknown uri: " + uri);

}

}

}

@Override

public Uri insert(Uri uri, ContentValues contentValues) {

final SQLiteDatabase db = myCityDbHelper.getWritableDatabase();

Uri returnUri;

switch (sUriMatcher.match(uri)){

case MY_CITY:

long _id = db.insert(MyCityContract.MyCityEntry.TABLE_MY_CITY,null,contentValues);

Log.d("id",String.valueOf(_id));

// insert unless it is already contained in the database

if(_id>0){

returnUri = MyCityContract.MyCityEntry.buildFlavorsUri(_id);

}else {

throw new android.database.SQLException("Failed to insert row into: " + uri);

}

break;

default: {

throw new UnsupportedOperationException("Unknown uri: " + uri );

}

}

getContext().getContentResolver().notifyChange(uri,null);

return returnUri;

}

@Override

public int delete(Uri uri, String selection, String[] selectionArgs) {

final SQLiteDatabase db = myCityDbHelper.getWritableDatabase();

final int match = sUriMatcher.match(uri);

int numDeleted;

switch(match){

case MY_CITY:

numDeleted = db.delete(

MyCityContract.MyCityEntry.TABLE_MY_CITY, selection, selectionArgs);

// reset _ID

db.execSQL("DELETE FROM SQLITE_SEQUENCE WHERE NAME = '" +

MyCityContract.MyCityEntry.TABLE_MY_CITY + "'");

break;

case MY_CITY_WITH_ID:

numDeleted = db.delete(MyCityContract.MyCityEntry.TABLE_MY_CITY,

MyCityContract.MyCityEntry._ID + " = ?",

new String[]{String.valueOf(ContentUris.parseId(uri))});

// reset _ID

db.execSQL("DELETE FROM SQLITE_SEQUENCE WHERE NAME = '" +

MyCityContract.MyCityEntry.TABLE_MY_CITY + "'");

break;

default:

throw new UnsupportedOperationException("Unknown uri: " + uri);

}

return numDeleted;

}

@Override

public int bulkInsert(Uri uri, ContentValues[] values){

final SQLiteDatabase db = myCityDbHelper.getWritableDatabase();

final int match = sUriMatcher.match(uri);

switch(match){

case MY_CITY:

// allows for multiple transactions

db.beginTransaction();

// keep track of successful inserts

int numInserted = 0;

try{

for(ContentValues value : values){

if (value == null){

throw new IllegalArgumentException("Cannot have null content values");

}

long _id = -1;

try{

_id = db.insertOrThrow(MyCityContract.MyCityEntry.TABLE_MY_CITY,

null, value);

}catch(SQLiteConstraintException e) {

Log.w(LOG_TAG, "Attempting to insert " +

value.getAsString(

MyCityContract.MyCityEntry.COLUMN_NAME)

+ " but value is already in database.");

}

if (_id != -1){

numInserted++;

}

}

if(numInserted > 0){

// If no errors, declare a successful transaction.

// database will not populate if this is not called

db.setTransactionSuccessful();

}

} finally {

// all transactions occur at once

db.endTransaction();

}

if (numInserted > 0){

// if there was successful insertion, notify the content resolver that there

// was a change

getContext().getContentResolver().notifyChange(uri, null);

}

return numInserted;

default:

return super.bulkInsert(uri, values);

}

}

@Override

public int update(Uri uri, ContentValues contentValues, String selection, String[] selectionArgs){

final SQLiteDatabase db = myCityDbHelper.getWritableDatabase();

int numUpdated = 0;

if (contentValues == null){

throw new IllegalArgumentException("Cannot have null content values");

}

switch(sUriMatcher.match(uri)){

case MY_CITY:{

numUpdated = db.update(MyCityContract.MyCityEntry.TABLE_MY_CITY,

contentValues,

selection,

selectionArgs);

break;

}

case MY_CITY_WITH_ID: {

numUpdated = db.update(MyCityContract.MyCityEntry.TABLE_MY_CITY,

contentValues,

MyCityContract.MyCityEntry._ID + " = ?",

new String[] {String.valueOf(ContentUris.parseId(uri))});

break;

}

default:{

throw new UnsupportedOperationException("Unknown uri: " + uri);

}

}

if (numUpdated > 0){

getContext().getContentResolver().notifyChange(uri, null);

}

return numUpdated;

}

}

MainActivityFragment

public class MainActivityFragment extends Fragment implements LoaderManager.LoaderCallbacks{

private static final String LOG_TAG = MainActivityFragment.class.getSimpleName();

private MyCityAdpapter myCityAdpapter;

private static final int CURSOR_LOADER_ID = 0;

private GridView mGridView;

MyCity[] mMyCity = {

new MyCity("Ancient Theatre - Larisa", R.drawable.larissa1),

new MyCity("Ancient Theatre - Larisa", R.drawable.larissa2),

new MyCity("Municipality park", R.drawable.larissa3),

new MyCity("Municipality park", R.drawable.larissa4),

new MyCity("Old trains",R.drawable.larissa5),

new MyCity("Old trains",R.drawable.larissa6),

new MyCity("Church",

R.drawable.larissa7),

new MyCity("Church",

R.drawable.larissa8),

new MyCity("Alcazar park",

R.drawable.larissa9),

new MyCity("Alcazar park",

R.drawable.larissa10),

new MyCity("AEL FC Arena",

R.drawable.larissa11),

new MyCity("AEL FC Arena",

R.drawable.larissa12),

new MyCity("Larissa Fair",

R.drawable.larissa13),

new MyCity("Larissa Fair",

R.drawable.larissa14),

new MyCity("Larissa Fair",

R.drawable.larissa15),

new MyCity("Larissa Fair",

R.drawable.larissa16)

};

public MainActivityFragment() {

// Required empty public constructor

}

@Override

public void onActivityCreated(@Nullable Bundle savedInstanceState) {

Cursor c =

getActivity().getContentResolver().query(MyCityContract.MyCityEntry.CONTENT_URI,

new String[]{MyCityContract.MyCityEntry._ID},

null,

null,

null);

if (c.getCount() == 0){

insertData();

}

// initialize loader

getLoaderManager().initLoader(CURSOR_LOADER_ID, null, this);

super.onActivityCreated(savedInstanceState);

}

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

// Inflate the layout for this fragment

// inflate fragment_main layout

final View rootView = inflater.inflate(R.layout.fragment_main_activity, container, false);

// initialize our FlavorAdapter

myCityAdpapter = new MyCityAdpapter(getActivity(), null, 0, CURSOR_LOADER_ID);

// initialize mGridView to the GridView in fragment_main.xml

mGridView = (GridView) rootView.findViewById(R.id.flavors_grid);

// set mGridView adapter to our CursorAdapter

mGridView.setAdapter(myCityAdpapter);

return rootView;

}

// insert data into database

public void insertData(){

ContentValues[] cityValuesArr = new ContentValues[mMyCity.length];

// Loop through static array of MyCity, add each to an instance of ContentValues

// in the array of ContentValues

for(int i = 0; i < mMyCity.length; i++){

cityValuesArr[i] = new ContentValues();

cityValuesArr[i].put(MyCityContract.MyCityEntry.COLUMN_ICON, mMyCity[i].image);

cityValuesArr[i].put(MyCityContract.MyCityEntry.COLUMN_NAME,

mMyCity[i].name);

}

// bulkInsert our ContentValues array

getActivity().getContentResolver().bulkInsert(MyCityContract.MyCityEntry.CONTENT_URI,

cityValuesArr);

}

@Override

public Loader onCreateLoader(int id, Bundle args){

return new CursorLoader(getActivity(),

MyCityContract.MyCityEntry.CONTENT_URI,

null,

null,

null,

null);

}

@Override

public void onLoadFinished(Loader loader, Cursor data) {

myCityAdpapter.swapCursor(data);

}

@Override

public void onLoaderReset(Loader loader){

myCityAdpapter.swapCursor(null);

}

}

我在片段的onCreateView(...)方法中读取了Cursor

@Override

public void onActivityCreated(@Nullable Bundle savedInstanceState) {

Cursor c =

getActivity().getContentResolver().query(MyCityContract.MyCityEntry.CONTENT_URI,

new String[]{MyCityContract.MyCityEntry._ID},

null,

null,

null);

if (c.getCount() == 0){

insertData();

}

// initialize loader

getLoaderManager().initLoader(CURSOR_LOADER_ID, null, this);

super.onActivityCreated(savedInstanceState);

}

这就是我引发null游标异常的地方。

有任何想法吗?

谢谢,

西奥

编辑

我改变了这个条件

if (c.getCount() == 0){

insertData();

}

if (c == null){

insertData();

}

我得到这个例外!

Caused by: java.lang.IllegalArgumentException: Unknown URL content://theo.testing.customloaders/my_city

因此提供程序存在错误。 唔...

android出现adpt2的问题,android - 尝试在空对象引用上调用接口方法'int android.database.Cursor.getCount()'[重复] - 堆栈内存溢出...相关推荐

  1. import android.view.window;,尝试在空对象引用上调用虚拟方法‘android.view.Window$回调...

    尝试在空对象引用上调用虚拟方法'android.view.Window$回调-android.view.Window.getCallback()' 当我SplashActivity打开LoginAct ...

  2. java设置按钮调用问题_按钮相关问题:尝试在空对象引用上调用虚方法

    我在Android中遇到了这个问题 . 01-30 20:32:57.415 24227-24227 / edu.gatech.seclass.vcipher E / AndroidRuntime:F ...

  3. android 虚方法,尝试在空对象引用上调用虚方法’android.view.View android.view.View.getRootView()’...

    我收到这个错误, "Attempt to invoke virtual method 'android.view.View android.view.View.getRootView()' ...

  4. java对象引用出错_上传图片错误:尝试在空对象引用上调用虚拟方法’java.lang.String android.net.Uri.getLastPathSegment()’...

    我有"用相机捕获图像"的问题,并将其存储到Firebase中.我认为该代码是正确的,因为它可以与"从图库中选择图像"一起使用.捕获完图像后,该应用程序停止了,并 ...

  5. android 字符串调用方法名,尝试在空对象引用上调用虚拟方法'java.lang.String android.content.Context.getPackageName()'...

    在其中一个片段中,有一个RecyclerView带有自定义适配器,并且单击其中一个项目将转到另一个页面,该页面是相同Activity的新实例.但是,某些行为会在我的应用程序中导致错误. 从我的活动中, ...

  6. android如何调用接口方法,在Android中访问WebService接口的方法

    需要引入ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar 代码如下: //WebService的命名空间 static final Str ...

  7. android 电视安装apk文件损坏,android - 无法在Android电视盒上安装APK - 堆栈内存溢出...

    我正在为Android TV编写应用程序. 它可以在模拟器上正常运行,并在Android电视盒上以调试模式运行. 但是,当我使用Android Studio生成apk并尝试将该apk安装在同一盒子上时 ...

  8. android通过c调用shmat函数,cmake - 尝试在Chipmunk上运行cmake发生错误,如何修复cmake文件? - 堆栈内存溢出...

    所以基本上我正在尝试在Linux Mint上构建Chipmunk物理库,并且它显然有一个cmake文件,我尝试运行该文件,但由于某些错误而未完成,输出为 cmake .. CMake Error at ...

  9. mac android sdk manager速度慢,android - SDK Manager无法在Mac上打开 - 堆栈内存溢出

    当我尝试打开sdkmanager时,它在终端上说 inconsistent location '/Users/username/Library/Android/sdk/build-tools/28.0 ...

最新文章

  1. 前沿科技 | 中科院科学家在视觉学习行为的神经机制研究中取得进展
  2. Toast的基本用法 吐司打印
  3. node + express + mongodb 手动配置
  4. 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contai
  5. 一步一步学ROP之linux_x64篇
  6. Oracle11gR2下搭建DataGuard主备同步详解
  7. ppt计算机控制系统实例,第部分计算机控制系统的应用实例.ppt
  8. (How to)Windows Live Writer插入Latex公式(补充)
  9. android设计模式之--观察者模式
  10. x11/xwindow GUI窗口代码范例
  11. shell有bool运算么_Windows Powershell条件表达式之条件操作符
  12. Vue2版Cnode社区webapp
  13. 解码2022中国网安强星丨构建企业第一重“安全感”,联软科技以零信任重塑网络安全边界
  14. systemd 编写微信鱼虾蟹棋牌搭建服务管理脚本
  15. WordPress获取当前网站域名
  16. Qt5+vs2017 UI界面添加新控件后,提示没有类成员
  17. 在线正则表达式测试器(JavaScript)
  18. java计算机毕业设计共享充电宝管理系统源码+mysql数据库+系统+lw文档+部署(2)
  19. 张良(?—前189年)
  20. 从数学计算上分析人脑与电脑差异

热门文章

  1. matlab位运算函数
  2. 读懂正则表达式就这么简单
  3. 关于压缩jar包时提示*.*没有这个文件或目录的问题以及解决办法:
  4. html验证座机号码_html5表单pattern属性配合正则验证电话和手机号码
  5. 图书馆为什么使用sip2协议_RFID无人智能借还书柜让微型图书馆“触手可及”
  6. 明日方舟抽卡模拟器wiki_明日方舟兑换码地址官服介绍 官服兑换码地址
  7. 考虑使用静态工厂方法替代构造方法
  8. 对软件工程课程的期望
  9. 使用DocFX生成文档
  10. java常用弹出式对话框