开发者

getReadableDatabase() Null Pointer Exception

开发者 https://www.devze.com 2023-03-20 19:48 出处:网络
I am entering some data into this database and then trying to display that data, but I get a Null Pointer Exception at getReadableDatabase(). The main activity from where I enter data is as follows:

I am entering some data into this database and then trying to display that data, but I get a Null Pointer Exception at getReadableDatabase(). The main activity from where I enter data is as follows:

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);
         }
        }
    }

This is my Helper Class

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  
    }
}

This is my Database class. I'm using it for input and data retrieval. It was working fine for input when the selectEmployees() method was not there but now it is showing 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 = 开发者_如何学Godb.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();
    }
    }
}

The EmployeeResult class:

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

This is 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


My problem is solved I found where the problem exactly the problem was in ListActivity and EmployeeResult class

For ListActivity take a XML layout with only text to display text in ListView Like this

<?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>

and in ListActivity you just need to set a ListAdapter

like this in onCreate() method

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

and insted of EmployeesResult class take String in ArrayAdapter and List

the method in DataBase class should be

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();
    }
}

I have passed String in List and ArrayAdepter, If u want more then one string like Name and Mobile Number or a combination of String and Image in the item in List View in that case u need to make a separate class in which u have images and string and you need to pass that class instead of String in List and ArrayAdepter.

THANX


The error may be caused by an null-pointer in Context

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

精彩评论

暂无评论...
验证码 换一张
取 消