【问题标题】:getReadableDatabase() Null Pointer ExceptiongetReadableDatabase() 空指针异常
【发布时间】:2011-07-15 15:42:47
【问题描述】:

我正在将一些数据输入此数据库,然后尝试显示该数据,但我得到了 Null Pointer Exception at getReadableDatabase()。我输入数据的主要活动如下:

public class TabListData extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button b = (Button) findViewById(R.id.enter);
        b.setOnClickListener(this);
        Button b1 = (Button) findViewById(R.id.employeeslist);
        b1.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        EditText name = (EditText) findViewById(R.id.name);
        EditText mobile = (EditText) findViewById(R.id.mobile);

        String nam = name.getText().toString();
        String mob = mobile.getText().toString();

        Button b = (Button) v;
        Button b1 = (Button) v;
         Database d = new Database(getBaseContext());

         switch (b.getId()) {
         case R.id.enter:
             d.input(nam, mob);
         case R.id.employeeslist:
            /* ArrayList<EmployeesResult> results = d.selectEmployees();
                Toast t = Toast.makeText(getBaseContext(), "# records: "
                        + results.size(), 1000);
                t.show();*/
             Intent i = new Intent(this, EmployeesList.class);
            // i.putExtra("Name", "Name");
             startActivity(i);
         }
        }
    }

这是我的助手类

public class BaseHelper extends SQLiteOpenHelper {

    public BaseHelper(Context context) {
        super(context, "Employees.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        String createtable = "create table Employee " + "(Name TEXT, " + "Mobile TEXT)";
        db.execSQL(createtable);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub  
    }
}

这是我的数据库类。我将它用于输入和数据检索。当selectEmployees() 方法不存在但现在显示Null Pointer Exception 时,它可以正常输入。

public class Database {

    private BaseHelper helper;
    SQLiteDatabase db;
    public Database(Context c){
        helper = new BaseHelper(c); 
    }

    public void input(String Name, String Mobile){
         db = helper.getWritableDatabase();
        try{
        ContentValues values = new ContentValues();
        values.put("Mobile", Mobile);
        values.put("Name", Name);
        db.insert("Employee", "", values);
        Log.e("ENTERED", "ENTERED   "+values);
        }finally {
            if (db != null)
                db.close();
        }
    }
    public ArrayList<EmployeesResult> selectEmployees() {

         db = helper.getReadableDatabase();
        try{
        ArrayList<EmployeesResult> results = new ArrayList<EmployeesResult>();
         Cursor c = db.rawQuery("select * from Employee", null);

         if (c.getCount() > 0) {
                c.moveToFirst();
                do {
                    results.add(new EmployeesResult(
                            c.getString(c.getColumnIndex("Name"))));
                            //c.getInt(c.getColumnIndex("Mobile"))));
                }while(c.moveToNext());
         }
        return results;
    }finally {
        if (db != null)
            db.close();
    }
    }
}

EmployeeResult 类:

public class EmployeesResult {
    public EmployeesResult(String Name){
        name = Name;
        //mobile = Mobile;  
    }
    public String name;
    public int mobile;
}

这是Logcat

07-15 23:44:11.008: ERROR/AndroidRuntime(292): FATAL EXCEPTION: main
07-15 23:44:11.008: ERROR/AndroidRuntime(292): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.TabListData/com.TabListData.EmployeesList}: java.lang.NullPointerException
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     at android.os.Looper.loop(Looper.java:123)
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     at android.app.ActivityThread.main(ActivityThread.java:4627)
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     at java.lang.reflect.Method.invokeNative(Native Method)
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     at java.lang.reflect.Method.invoke(Method.java:521)
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     at dalvik.system.NativeStart.main(Native Method)
07-15 23:44:11.008: ERROR/AndroidRuntime(292): Caused by: java.lang.NullPointerException
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:158)
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     at com.TabListData.Database.selectEmployees(Database.java:35)
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     at com.TabListData.EmployeesList.onCreate(EmployeesList.java:30)
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
07-15 23:44:11.008: ERROR/AndroidRuntime(292):     ... 11 more

【问题讨论】:

  • 代码中的缩进和括号会发生一些非常奇怪的事情。您可能想检查在此处复制时格式是否损坏。
  • 另外,哪一行报错了?
  • 你为什么不尝试在 BaseHelper 中创建将返回数据库的方法。 db = SQLiteDatabase.openDatabase(pathToTheDatabase, null, SQLiteDatabase.OPEN_READWRITE);假设数据库已经存在于您的 /data/data//databases 中。或使用 SQLiteDatabase.openOrCreateDatabase(file.getPath(), null);这相当于前面提到的方式。您的数据库为空,这就是您抛出 NullPointerException 的原因
  • 我也尝试在 DaseHelper 中创建方法,但结果相同 Null 指针异常我已经检查了我的数据库 在创建 selectEmployees() 之前我输入的不是空条目我正在发布 Logcat 请帮助.

标签: android sqlite nullpointerexception


【解决方案1】:

我的问题解决了,我发现问题出在 ListActivity 和 EmployeeResult 类中

对于 ListActivity 采用只有文本的 XML 布局以在 ListView 中显示文本 像这样

<?xml version="1.0" encoding="UTF-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"    
android:layout_width="fill_parent"    
android:layout_height="fill_parent"    
android:padding="10dp"    
android:textSize="16sp" >
</TextView>

在 ListActivity 中你只需要设置一个 ListAdapter

在 onCreate() 方法中像这样

List<String> data = dh.SelectStudent();
setListAdapter(new ArrayAdapter<String>(ListofStudents.this, R.layout.text, data));

EmployeesResult 类的 insted 在 ArrayAdapter 和 List 中采用 String

DataBase 类中的方法应该是

public ArrayList<String> SelectStudent() {
    SQLiteDatabase db = _dbHelper.getReadableDatabase();
    try {
        ArrayList<String> results = new ArrayList<String>();
        Cursor c = db.rawQuery("select * from Student", null);
        if (c.getCount() > 0) {
            c.moveToFirst();
            do {
                results.add(c.getString(1));
               // results.add(c.getString(4));

            } while (c.moveToNext());
        }
        return results;
    } finally {
        if (db != null)
            db.close();
    }
}

我已经在 List 和 ArrayAepter 中传递了字符串,如果你想要一个以上的字符串,比如姓名和手机号码,或者列表视图中的项目中的字符串和图像的组合,在这种情况下,你需要创建一个单独的类,你有图像和字符串,您需要在 List 和 ArrayAepter 中传递该类而不是 String。

感谢

【讨论】:

  • 我遇到了和你一样的问题。但我不明白你的解决方法。 NullPointerException 被抛出SQLiteDatabase db = _dbHelper.getReadableDatabase();,你没有改变这一行,但为什么它是固定的?谢谢!
【解决方案2】:

该错误可能是由上下文中的空指针引起的

public class SqLite extends SQLiteOpenHelper {
    public SqLite(Context context, String table, boolean readOnly) {
        super(context, DB_NAME, null, 1);
        getReadableDatabase();    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    相关资源
    最近更新 更多