1

主要活动:

private Button btnSubmit;
private DataSource mDataSource;
private Context mContext;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    final EditText first_name = (EditText) findViewById(R.id.first_name);
    final Spinner relation = (Spinner) findViewById(R.id.relation);
    final EditText address = (EditText) findViewById(R.id.address);
    Button  mSubmitButton = (Button) findViewById(R.id.btnSubmit);
    relation.setOnItemSelectedListener(new CustomOnItemSelectedListener());
    mSubmitButton.setOnClickListener(new View.OnClickListener() {

           @Override
           public void onClick(View v) {
                 String fName = first_name.getText().toString();
                 String re_lation = (String) relation.getSelectedItem(); 
                 String add_ress = address.getText().toString();
                 if ((fName.length() <=0) || (re_lation.length()<=0) || (add_ress.length()<=0)) {
                        Toast.makeText(MyAndroidAppActivity.this, "please fill the data", Toast.LENGTH_SHORT).show();
                 } else{
                        Log.i("name",fName);
                        Log.i("rel",re_lation);
                        Log.i("e",add_ress);
                        mDataSource.addUser(fName, re_lation, add_ress);

                 }
           }
     });
}

数据源.java

private SQLiteDatabase mSQLiteDatabase;
private MySQLiteHelper mSQLiteHelper;
private String[] mAllColumns = {
      MySQLiteHelper.COLUMN_ID, MySQLiteHelper.COLUMN_FIRST_NAME, MySQLiteHelper.COLUMN_RELATION, MySQLiteHelper.COLUMN_ADDRESS
};

public DataSource (Context context){
      mSQLiteHelper = new MySQLiteHelper(context);
}

public void open() throws SQLiteException {
      mSQLiteDatabase = mSQLiteHelper.getWritableDatabase();
}

public void close() {
      mSQLiteHelper.close();
}

public void addUser(String first_name, String relation, String address){
      ContentValues values = new ContentValues();
      Log.i("name",first_name);
      values.put(MySQLiteHelper.COLUMN_FIRST_NAME, first_name);
      values.put(MySQLiteHelper.COLUMN_RELATION, relation);
      values.put(MySQLiteHelper.COLUMN_ADDRESS, address);
      mSQLiteDatabase.insert(MySQLiteHelper.TABLE_USERS, null, values);
      //Cursor cursor = mSQLiteDatabase.query(MySQLiteHelper.TABLE_USERS, allcolumns, selection, selectionArgs, groupBy, having, orderBy)
}

MySQLiteHelper.java

public class MySQLiteHelper extends SQLiteOpenHelper {
        public static final String TABLE_USERS = "users";
        public static final String COLUMN_ID = "_id";
        public static final String COLUMN_FIRST_NAME = "first_name";
        public static final String COLUMN_RELATION = "relation";
        public static final String COLUMN_ADDRESS = "address";



        private static final String DATABASE_NAME = "users.db";
        private static final int DATABASE_VERSION = 1;

        // Database creation sql statement
        private static final String DATABASE_CREATE = "create table "
                + TABLE_USERS + "( " + COLUMN_ID
                + " integer primary key autoincrement, " + COLUMN_FIRST_NAME
                + " text not null," + COLUMN_RELATION + " text not null," +
                COLUMN_ADDRESS + " text not null);";



        public MySQLiteHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(DATABASE_CREATE);

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS "+TABLE_USERS);
            onCreate(db);

        }
}

错误日志:

06-20 11:26:02.043: E/AndroidRuntime(342): FATAL EXCEPTION: main
06-20 11:26:02.043: E/AndroidRuntime(342): java.lang.NullPointerException
06-20 11:26:02.043: E/AndroidRuntime(342):  at com.mkyong.android.MyAndroidAppActivity$1.onClick(MyAndroidAppActivity.java:62)
06-20 11:26:02.043: E/AndroidRuntime(342):  at android.view.View.performClick(View.java:2485)
06-20 11:26:02.043: E/AndroidRuntime(342):  at android.view.View$PerformClick.run(View.java:9080)
06-20 11:26:02.043: E/AndroidRuntime(342):  at android.os.Handler.handleCallback(Handler.java:587)
06-20 11:26:02.043: E/AndroidRuntime(342):  at android.os.Handler.dispatchMessage(Handler.java:92)
06-20 11:26:02.043: E/AndroidRuntime(342):  at android.os.Looper.loop(Looper.java:123)
06-20 11:26:02.043: E/AndroidRuntime(342):  at android.app.ActivityThread.main(ActivityThread.java:3683)
06-20 11:26:02.043: E/AndroidRuntime(342):  at java.lang.reflect.Method.invokeNative(Native Method)
06-20 11:26:02.043: E/AndroidRuntime(342):  at java.lang.reflect.Method.invoke(Method.java:507)
06-20 11:26:02.043: E/AndroidRuntime(342):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-20 11:26:02.043: E/AndroidRuntime(342):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)

在这里,在错误行中,我在 sqlite 数据库中插入微调器和其他文本值时出现空指针异常 mDataSource.addUser(fName, re_lation, add_ress);

我得到了三个值。但是这里没有创建数据库。我指出了错误行,并且在将值提交到数据库时,它抛出了空指针异常。我的程序中的错误是什么。有人可以告诉我吗?

提前致谢

4

1 回答 1

0

mDataSource尚未初始化

你应该在你的onCreate()回调中初始化它

protected void onCreate(Bundle savedInstanceState)
{

setContentView(R.layout.layout);
mDataSource = new DataSource(getBaseContext());

// ... The Rest of your code
}

并且在您的数据源的构造函数调用中还有 open() 方法

public DataSource (Context context){

mSQLiteHelper = new MySQLiteHelper(context);
open();
}

public void open() throws SQLiteException {
        mSQLiteDatabase = mSQLiteHelper.getWritableDatabase();
}
于 2012-06-20T06:14:10.707 回答