尝试插入行和字段时返回Null?

时间:2015-04-24 17:00:25

标签: android

您好我正在尝试填充列表视图我在主要Acivity上使用以下内容来连接我的数据库处理程序

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mNavigationDrawerFragment = (NavigationDrawerFragment)
                getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
        mTitle = getTitle();

        // Set up the drawer.
        mNavigationDrawerFragment.setUp(
                R.id.navigation_drawer,
                (DrawerLayout) findViewById(R.id.drawer_layout));

     List<Patients> patientsList= new ArrayList<Patients>();
     patientsList = _db.getALlPatients();
    ArrayAdapter<Patients> adapter = new ArrayAdapter<Patients>
    this,android.R.layout.simple_list_item_1,patientsList);
    ListView lv= (ListView) findViewById(R.id.listView);
     lv.setAdapter(adapter);
    }

我的GetAllPatients()如下

public List<Patients> getALlPatients() {
    List<Patients> _patients = new ArrayList<Patients>();

    SQLiteDatabase db = getWritableDatabase();
    Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_CONTACTS, null);

    if (cursor.moveToFirst()) {
        do {
            _patients.add(new Patients(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4),cursor.getString(5), Uri.parse(cursor.getString(6))));
        }
        while (cursor.moveToNext());
    }
    if (cursor.getCount()==0)
    {

        _patients.add(new Patients(1,"David Buckley","","","","",null));
        _patients.add(new Patients(2,"James Buckley","","","","",null));
    }

    cursor.close();
    db.close();
    return _patients;
}

问题

正如您所见,我使用if (cursor.getCount()==0)插入一些测试数据作为测试,但在启动应用程序时,我从编译器中获得以下内容:

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.okason.Cautio/com.davidbuckley.Cautio.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List com.davidbuckley.Cautio.Dal.DatabaseHandler.getALlPatients()' on a null object reference

我认为这与db的写访问有关。我正在使用以下

创建
 public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE_CONTACTS + "(" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_NAME + " TEXT," + KEY_PHONE + " TEXT," + KEY_EMAIL + " TEXT," + KEY_ADDRESS + " TEXT," + KEY_IMAGEURI + " TEXT)");
    }

 public void createContact(Patients contact) {
    SQLiteDatabase db = getWritableDatabase();

    ContentValues values = new ContentValues();

    values.put(KEY_NAME, contact.getName());
    values.put(KEY_PHONE, contact.getPhone());
    values.put(KEY_CONTACTPHONE, contact.get_contactPhone());

    values.put(KEY_EMAIL, contact.getEmail());
    values.put(KEY_ADDRESS, contact.getAddress());
    values.put(KEY_IMAGEURI, contact.getImageURI().toString());

    db.insert(TABLE_CONTACTS, null, values);
    db.close();
}

任何人都有任何想法,我如何浏览设备上的数据库是否有任何检查文件结构的方法?

更新我用此初始化db的treid。

列出patientsList = new ArrayList();

    DatabaseHandler db = new DatabaseHandler(this);

   patientsList = db.getALlPatients();

 ArrayAdapter<Patients> adapter = new ArrayAdapter<Patients>(this,android.R.layout.simple_list_item_1,patientsList);

  ListView lv= (ListView) findViewById(R.id.listView);

  lv.setAdapter(adapter);

但现在它只是在加载时因同样的错误而崩溃。

尝试在空对象上调用虚方法'java.util.List com.davidbuckley.Cautio.Dal.DatabaseHandler.getALlPatients()'参考

2 个答案:

答案 0 :(得分:0)

关于浏览数据库(假设您正在使用SQLite),可以使用DBBrowser检查表结构和内容。虽然这样做,但您需要首先提取应用程序数据库文件并通过DBBrowser加载它。这在使用虚拟机时没有问题,因为您可以使用ADM来拉取它,但是从物理设备中提取数据库文件会有点困难,因为如果首先要获取访问应用程序的数据库文件的位置,则需要root。存储。

Here's指向DBBrowser的链接

答案 1 :(得分:0)

这是我对这种情况的看法。 你看到这一行

patientsList = _db.getALlPatients();

此版本_db尚未在onCreate之前的任何位置初始化。

我认为你想做的只是

List<Patients> patientsList = getALlPatients();

你应该解决这个问题。