我正在集成数据库来保存和存储以后要检索的基本联系信息.但是,我的应用程序现在在启动时崩溃,所以我甚至无法验证是否正在创建表等.
05-05 16:39:50.671  11631-11631/treehouse.greenlight E/AndroidRuntime﹕   FATAL EXCEPTION: main
Process: treehouse.greenlight,PID: 11631
java.lang.RuntimeException: Unable to start activity ComponentInfo{treehouse.greenlight/treehouse.greenlight.Home_screen}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.sqliteDatabase android.content.Context.openorCreateDatabase(java.lang.String,int,android.database.sqlite.sqliteDatabase$CursorFactory,android.database.DatabaseErrorHandler)' on a null object reference
        at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2205)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2255)
        at android.app.ActivityThread.access$800(ActivityThread.java:142)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1203)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5118)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.sqliteDatabase android.content.Context.openorCreateDatabase(java.lang.String,android.database.DatabaseErrorHandler)' on a null object reference
        at android.database.sqlite.sqliteOpenHelper.getDatabaseLocked(sqliteOpenHelper.java:224)
        at android.database.sqlite.sqliteOpenHelper.getWritableDatabase(sqliteOpenHelper.java:164)
        at treehouse.greenlight.MyDBHandler.addContact(MyDBHandler.java:54)
        at treehouse.greenlight.ContactsFragment.onCreateLoader(ContactsFragment.java:117)
        at android.support.v4.app.LoaderManagerImpl.createLoader(LoaderManager.java:490)
        at android.support.v4.app.LoaderManagerImpl.createAndInstallLoader(LoaderManager.java:499)
        at android.support.v4.app.LoaderManagerImpl.initLoader(LoaderManager.java:553)
        at treehouse.greenlight.ContactsFragment.onActivityCreated(ContactsFragment.java:71)
        at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1797)
        at android.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:979)
        at android.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:1138)
        at android.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:1120)
        at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1929)
        at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:547)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171)
        at android.app.Activity.performStart(Activity.java:5285)
        at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2178)

数据库处理程序代码:

public class MyDBHandler extends sqliteOpenHelper {

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "contactsDB.db";
public static final String TABLE_CONTACTS = "contacts";
private Context context;
public static final String COLUMN_ID = "_id";
public static final String COLUMN_NAME = "name";
public static final String COLUMN_PHONE = "phone";
public static final String COLUMN_STATUS = "status";
public static final String COLUMN_BLURB = "blurb";

public MyDBHandler(Context context,String name,CursorFactory factory,int version)  {
    super(context,DATABASE_NAME,factory,DATABASE_VERSION);

}
    @Override
    public void onCreate (sqliteDatabase db){

        String CREATE_CONTACTS_TABLE = "CREATE TABLE " +
                TABLE_CONTACTS + "("
                + COLUMN_ID + " INTEGER PRIMARY KEY," + ContactsContract.CommonDataKinds.Phone.disPLAY_NAME
                + " TEXT," + ContactsContract.CommonDataKinds.Phone.NUMBER + " INTEGER,"
                + COLUMN_STATUS + " TEXT," + COLUMN_BLURB
                + " TEXT" + ");";
        db.execsql(CREATE_CONTACTS_TABLE);
    }

    @Override
    public void onUpgrade (sqliteDatabase db,int oldVersion,int newVersion){
        db.execsql("DROP TABLE IF EXISTS " + TABLE_CONTACTS);
        onCreate(db);
    }
public void addContact(ContactsDb contacts) {

    ContentValues values = new ContentValues();
    values.put(COLUMN_NAME,contacts.getName());
    values.put(COLUMN_PHONE,contacts.getPhone());
    values.put(COLUMN_STATUS,contacts.getStatus());
    values.put(COLUMN_BLURB,contacts.getBlurb());

    sqliteDatabase db = this.getWritableDatabase();
    db.insert(TABLE_CONTACTS,null,values);

}

logcat说问题是sqliteDatabase db = this.getWriteableDatabase();

这也是我违规的Contactsfragment:

public class ContactsFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {

private CursorAdapter mAdapter;
private Context context;
TextView idView;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // create adapter once
    Context context = getActivity();
    int layout = R.layout.activity_list_item_1;
    Cursor c = null; // there is no cursor yet
    int flags = 0; // no auto-requery! Loader requeries.
    mAdapter = new SimpleCursorAdapter(context,layout,c,FROM,TO,flags);

}


public void ContactsDb(Context context) {
    this.context=context;


}
Uri contentUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;

String[] PROJECTION = {
        ContactsContract.Contacts.HAS_PHONE_NUMBER,ContactsContract.Contacts._ID,// _ID is always required
        ContactsContract.CommonDataKinds.Phone.disPLAY_NAME_PRIMARY,// that is what we want to display
        Contacts.TIMES_CONTACTED,ContactsContract.CommonDataKinds.Phone.NUMBER

};

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    // each time we are started use our listadapter
    setlistadapter(mAdapter);
    // and tell loader manager to start loading
    getLoaderManager().initLoader(0,this);
}

// columns requested from the database


// and name should be displayed in the text1 textview in item layout

public String[] has_phone = {ContactsContract.Contacts.HAS_PHONE_NUMBER};

    String phone = "0";
    int dbPhone = 0;
private  final String[] FROM = {Contacts.disPLAY_NAME_PRIMARY,ContactsContract.CommonDataKinds.Phone.NUMBER};
private final int[] TO = {android.R.id.text1,dbPhone};


public void newContact (View view) {
    MyDBHandler dbHandler = new MyDBHandler(context,1);

    String name = Contacts.disPLAY_NAME_PRIMARY;
    int dbPhone =
    Integer.parseInt(phone);

    String status ="";
    String blurb ="";
    ContactsDb contacts =
            new ContactsDb(name,dbPhone,status,blurb);
    dbHandler.addContact(contacts);

}


@Override
public Loader<Cursor> onCreateLoader(int id,Bundle args) {
    Context context = this.context;
    // load from the "Contacts table"
    MyDBHandler dbHandler = new MyDBHandler(context,1);

    String name = Contacts.disPLAY_NAME_PRIMARY;
    int phone = Integer.parseInt(ContactsContract.CommonDataKinds.Phone.NUMBER);

    String status ="Busy";
    String blurb ="N/A";

    ContactsDb contacts =
            new ContactsDb(name,blurb);
    dbHandler.addContact(contacts);

    // no sub-selection,no sort order,simply every row
    // projection says we want just the _id and the name column
    return new CursorLoader(getActivity(),contentUri,PROJECTION,ContactsContract.Contacts.HAS_PHONE_NUMBER + " =? AND " + Contacts.TIMES_CONTACTED + ">=?",// This is selection string,we're looking for records that HAS_PHONE_NUMBER is 1
            new String[]{"1","0"},// 1 means that contact has a phone number & 60 is the amount of times contacted (arbitrary - needs to be fixed before release)
            null);
}

最后,这是ContactsDB类:

public ContactsDb(String name,int phone,String status,String blurb) {

    this._name = name;
    this._phone = phone;
    this._status = status;
    this._blurb = blurb;

非常感谢任何帮助 – 我认为问题在于我的Context为null.我只是不确定为什么它会在我的MyDBHandler文件中定义它.截至目前,我无法验证是否正在创建数据库,更不用说保存数据了.

干杯&感谢您的时间和耐心,
希亚姆

解决方法

看起来你不小心创建了一个上下文局部变量而不是使用实例变量.

因此,当您将其传递给MyDBHandler时,context为null,因此当您调用this.getWritableDatabase()时,它为null.因此,您可以在日志中看到NullPointerException:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.sqliteDatabase android.content.Context.openorCreateDatabase(java.lang.String,android.database.DatabaseErrorHandler)' on a null object reference
        at android.database.sqlite.sqliteOpenHelper.getDatabaseLocked(sqliteOpenHelper.java:224)
        at android.database.sqlite.sqliteOpenHelper.getWritableDatabase(sqliteOpenHelper.java:164)

尝试将所有与Context相关的代码移动到onActivityCreated()以确保您具有有效的Context,并确保使用实例变量而不是局部变量:

public class ContactsFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {

private CursorAdapter mAdapter;
private Context context; //this is the Context you will use
TextView idView;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // create adapter once
    //Context context = getActivity(); //Here was the problem
    //int layout = R.layout.activity_list_item_1;
    //Cursor c = null; // there is no cursor yet
    //int flags = 0; // no auto-requery! Loader requeries.
    //mAdapter = new SimpleCursorAdapter(context,ContactsContract.CommonDataKinds.Phone.NUMBER

};

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    //Add this here:
    context = getActivity(); //use the instance variable
    int layout = R.layout.activity_list_item_1;
    Cursor c = null; // there is no cursor yet
    int flags = 0; // no auto-requery! Loader requeries.
    mAdapter = new SimpleCursorAdapter(context,flags);

    // each time we are started use our listadapter
    setlistadapter(mAdapter);
    // and tell loader manager to start loading
    getLoaderManager().initLoader(0,dbPhone};


public void newContact (View view) {

    //context should Now be valid:
    MyDBHandler dbHandler = new MyDBHandler(context,blurb);
    dbHandler.addContact(contacts);

}
//........

启动时Android应用程序崩溃:ContactsFragment中的SQLite NullPointerException的更多相关文章

  1. html5利用canvas实现颜色容差抠图功能

    这篇文章主要介绍了html5利用canvas实现颜色容差抠图功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  2. Canvas图片分割效果的实现

    这篇文章主要介绍了Canvas图片分割效果的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. HTML5 Canvas实现放大镜效果示例

    这篇文章主要介绍了HTML5 Canvas实现放大镜效果示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  4. Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)

    这篇文章主要介绍了Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. html5如何在Canvas中实现自定义路径动画示例

    本篇文章主要介绍了html5如何在Canvas中实现自定义路径动画示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  6. canvas实现圆形进度条动画的示例代码

    这篇文章主要介绍了canvas实现圆形进度条动画的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. 教你使用Canvas处理图片的方法

    本篇文章主要介绍了教你使用Canvas处理图片的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. 手把手教你实现一个canvas智绘画板的方法

    这篇文章主要介绍了手把手教你实现一个canvas智绘画板的方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  9. 使用canvas来完成线性渐变和径向渐变的功能的方法示例

    这篇文章主要介绍了使用canvas来完成线性渐变和径向渐变的功能的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  10. H5 canvas实现贪吃蛇小游戏

    本篇文章主要介绍了H5 canvas实现贪吃蛇小游戏,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部