Android:更新SQLite数据库值时出现空指针异常

Android:更新SQLite数据库值时出现空指针异常,android,android-sqlite,Android,Android Sqlite,我不熟悉安卓系统。我正在使用现有的SQLite数据库开发SQLite简单的应用程序。启动器活动使用listview显示来自SQLite的数据列表。当用户单击Launcher活动中的一个项目时,它将转到下一个活动(详细信息活动)。在下一个活动中,我希望让用户根据应用程序的输入更新数据库。对于更新数据库,我有添加选项项菜单按钮(编辑信息)。当用户单击OnOptions项目按钮时,它将转到另一个活动。在另一个活动中,将有三个(编辑文本)来接受用户的输入。和“保存”按钮将新数据保存到现有数据库 问题:我

我不熟悉安卓系统。我正在使用现有的SQLite数据库开发
SQLite
简单的应用程序。启动器活动使用listview显示来自SQLite的数据列表。当用户单击Launcher活动中的一个项目时,它将转到下一个活动(详细信息活动)。在下一个
活动中,我希望让用户根据应用程序的输入更新数据库。对于更新数据库,我有添加选项项菜单按钮(编辑信息)。当用户单击OnOptions项目按钮时,它将转到另一个活动。在另一个活动中,将有三个(编辑文本)来接受用户的输入。和“保存”按钮将新数据保存到现有数据库

问题:我面临onoptions菜单项Null pointer exception的问题,并且无法保存到数据库

有人能帮我吗? 欢迎各界人士提出意见

这是我的密码

Next Activity.java

 public class CompDetail extends Activity {
 //ArrayList<GS> q = new ArrayList<GS>();
 private GS gs;
 CustomAdapter adapter;
 private TextView tv_title, tv_address, tv_phno;
 String name, address, phone, lat, lng;
 Bundle extra;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detail);

    // ////////// Action Bar ///////
    ActionBar actionBar = getActionBar();

    // DBAdapter
    DBAdapter db = DBAdapter.getDBAdapter(getApplicationContext());
    if (!db.checkDatabase()) {
        db.createDatabase(getApplicationContext());
    }
    db.openDatabase();

    extra = getIntent().getExtras();
    String id = extra.getString("id");
    findId();

    Cursor c = db.getDetailInfoById(id, 0);

    int count = c.getCount();
    if (count > 0) {
        while (c.moveToNext()) {
            name = c.getString(c.getColumnIndex("name"));
            phone = c.getString(c.getColumnIndex("phone"));
            address = c.getString(c.getColumnIndex("addr"));

            tv_title.setText(name);
            tv_address.setText(address);
            tv_phno.setText(phone);

        }

    }

    private void findId() {
    // TODO Auto-generated method stub
    tv_title = (TextView) findViewById(R.id.tv_title);
    tv_address = (TextView) findViewById(R.id.tv_address);
    tv_phno = (TextView) findViewById(R.id.tv_phno);
   }

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.second_action_bar, menu);
    return super.onCreateOptionsMenu(menu);
}

//Error 
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.editinfo:
        Intent i = new Intent(getApplicationContext(), EditInfo.class);
        i.putExtra("idforedit", gs.getId());
        startActivity(i);
        return true;
    case R.id.editpin:
        Intent intent=new Intent(getApplicationContext(),EditMap.class);
        startActivity(intent);
        return true;

    default:
        break;
    }
    return super.onOptionsItemSelected(item);
}

class CustomAdapter extends ArrayAdapter<GS> {
    ArrayList<GS> list;
    LayoutInflater mInfalter;
    private String param;

    public CustomAdapter(Context context, ArrayList<GS> list) {
        super(context, R.layout.detail_text, list);
        this.list = list;
        mInfalter = LayoutInflater.from(context);

        for (int i = 0; i < list.size(); i++) {
            Log.i("................", "" + list.get(i).getId());
        }

    }

    @Override
    public View getView(final int position, View convertView,
            ViewGroup parent) {
        ViewHolder holder;
        Log.i("..........", "Hello in getView");

        convertView = mInfalter.inflate(R.layout.activity_detail, parent,
                false);// --customlayout.xml
                        // must
                        // have
                        // a
                        // textView
        holder = new ViewHolder();
        holder.name = (TextView) convertView.findViewById(R.id.tv_title);
        // holder.address = (TextView)
        // convertView.findViewById(R.id.textView1);
        // holder.phno = (TextView)
        // convertView.findViewById(R.id.textView1);
        // convertView.setTag(holder);
        // final int i = convertView.getId();
        // } else {
        // holder = (ViewHolder) convertView.getTag();
        // }

        holder.name.setText(list.get(position).getName());

        convertView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
        //                  Toast.makeText(
       //                           getBaseContext(),
       //                           "Position data" + position
      //                                    + q.get(position).getId(),
     //                         Toast.LENGTH_SHORT).show();
                Intent i = new Intent(getApplicationContext(),
                        EditInfo.class);
                i.putExtra("id", gs.getId());
                startActivity(i);

            }



        });

        return convertView;

    }

}

static class ViewHolder {
    TextView name;
    TextView address;
    TextView phno;
    }
 }
公共类CompDetail扩展活动{
//ArrayList q=新的ArrayList();
私人秘书处;
自定义适配器;
私人文本视图电视标题、电视地址、电视phno;
字符串名称、地址、电话、lat、lng;
额外捆绑;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_详细信息);
////操作栏///////
ActionBar ActionBar=getActionBar();
//DBAdapter
DBAdapter db=DBAdapter.getDBAdapter(getApplicationContext());
如果(!db.checkDatabase()){
createDatabase(getApplicationContext());
}
openDatabase();
extra=getIntent().getExtras();
字符串id=extra.getString(“id”);
findId();
游标c=db.getDetailInfoById(id,0);
int count=c.getCount();
如果(计数>0){
while(c.moveToNext()){
name=c.getString(c.getColumnIndex(“name”);
phone=c.getString(c.getColumnIndex(“phone”);
地址=c.getString(c.getColumnIndex(“addr”);
tv_title.setText(名称);
tv_address.setText(地址);
tv_phno.setText(电话);
}
}
私人空间{
//TODO自动生成的方法存根
tv_title=(TextView)findviewbyd(R.id.tv_title);
tv_地址=(TextView)findviewbyd(R.id.tv_地址);
tv_phno=(TextView)findviewbyd(R.id.tv_phno);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
MenuInflater充气机=getMenuInflater();
充气机。充气(右菜单。第二个动作栏,菜单);
返回super.onCreateOptions菜单(菜单);
}
//错误
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
开关(item.getItemId()){
案例R.id.editinfo:
Intent i=新的Intent(getApplicationContext(),EditInfo.class);
i、 putExtra(“idforedit”,gs.getId());
星触觉(i);
返回true;
案例R.id.editpin:
Intent Intent=新的Intent(getApplicationContext(),EditMap.class);
星触觉(意向);
返回true;
违约:
打破
}
返回super.onOptionsItemSelected(项目);
}
类CustomAdapter扩展了ArrayAdapter{
数组列表;
更平坦的米法尔特;
私有字符串参数;
公共CustomAdapter(上下文上下文,ArrayList列表){
超级(上下文、右布局、详细信息、文本、列表);
this.list=列表;
mInfalter=LayoutInflater.from(上下文);
对于(int i=0;i
EditInfo.java

 public class EditInfo extends Activity {
//ArrayList<GS> q = new ArrayList<GS>();
GS gs = new GS();
private String id = "";
private String city = "";
Bundle extra;
String name, address1,address2, phone;
 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_edit_info);

    extra = getIntent().getExtras();
    String id = extra.getString("idforedit");

     DBAdapter db = DBAdapter.getDBAdapter(getApplicationContext());
    if (!db.checkDatabase()) {
        db.createDatabase(getApplicationContext());
    }
    db.openDatabase();

    extra = getIntent().getExtras();
    String id1 = extra.getString("idforedit");


    Cursor c = db.getDetailInfoById(id1, 1);

    int count = c.getCount();

    if (count > 1) {
        while (c.moveToNext()) {

            final EditText txtEditname = (EditText) findViewById(R.id.btn_name);
            txtEditname.setText(name);
            final EditText txtStr = (EditText) findViewById(R.id.btn_addr1);
            txtStr.setText(address1);
            final EditText txtAddr = (EditText) findViewById(R.id.btn_addr2);           
            txtAddr.setText(address2);
            final EditText txtPh1 = (EditText) findViewById(R.id.btn_phno);
            txtPh1.setText(phone);
            Button btnsave=(Button) findViewById(R.id.btn_save);
            btnsave.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    DBAdapter db = DBAdapter.getDBAdapter(getApplicationContext());
                    String name = txtEditname.getText().toString();
                    String address = txtStr.getText().toString() + ","
                            + txtAddr.getText().toString();
                    gs.setName(name);
                    gs.setAddress(address);
                    gs.setPhno(txtPh1.getText().toString());

                    if ((db).EditInfo(gs)) {
                        Toast.makeText(getBaseContext(), "Update Successful",
                                Toast.LENGTH_SHORT).show();
                        finish();
                    } else {
                        Toast.makeText(getBaseContext(), "Update Fail",
                                Toast.LENGTH_SHORT).show();
                    }
                }
            });

    Button btnCancel = (Button) findViewById(R.id.btn_cancel);
    btnCancel.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            finish();

        }
    });
}


 }
公共类EditInfo扩展活动{
//ArrayList q=新的ArrayList();
GS=新GS();
私有字符串id=“”;
私人字符串城市=”;
额外捆绑;
字符串名称,地址1,地址2,电话;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u edit\u info);
extra=getIntent().getExtras();
String id=extra.getString(“idforedit”);
DBAdapter db=DBAdapter.getDBAdapter(getApplicationContext());
如果(!db.checkDatabase()){
createDatabase(getApplicationContext());
}
openDatabase();
extra=getIntent().getExtras();
String id1=extra.getString(“idforedi
 public class DBAdapter extends SQLiteOpenHelper {
CustomAdapter adapter;
static String name = "mydb.db";
static String path = "";
static ArrayList<GS> gs;
static SQLiteDatabase sdb;

 DBAdapter(Context v) {
    super(v, name, null, 1);
    path = "/data/data/" + v.getApplicationContext().getPackageName()
            + "/databases";
}

 public boolean checkDatabase() {
    SQLiteDatabase db = null;
    try {
        db = SQLiteDatabase.openDatabase(path + "/" + name, null,
                SQLiteDatabase.OPEN_READONLY);
    } catch (Exception e) {
        e.printStackTrace();
    }
    if (db == null) {
        return false;
    } else {
        db.close();
        return true;
    }
}

public static synchronized DBAdapter getDBAdapter(Context v) {
    return (new DBAdapter(v));
}

public void createDatabase(Context v) {
    this.getReadableDatabase();
    try {
        InputStream myInput = v.getAssets().open(name);
        // Path to the just created empty db
        String outFileName = path + "/" + name;
        // Open the empty db as the output stream
        OutputStream myOutput = new FileOutputStream(outFileName);
        // transfer bytes from the inputfile to the outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }
        // Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();
    } catch (IOException e) {
        System.out.println(e);
    }
}

public void openDatabase() {
    try {
        sdb = SQLiteDatabase.openDatabase(path + "/" + name, null,
                SQLiteDatabase.OPEN_READWRITE);
    } catch (Exception e) {
        System.out.println(e);
    }
}

 Cursor getDetailInfoById(String id, int i) {
    // TODO Auto-generated method stub

    Cursor Cur = null;
    SQLiteDatabase db = this.getReadableDatabase();
    try {
        GS q1 = new GS();
        Cur = db.rawQuery("select * from customer where customer_uid = '"
                + id + "'", null);
        q1.setName(Cur.getString(3));
        q1.setAddress(Cur.getString(7) + " " + Cur.getString(8) + " "
                + Cur.getString(5));
        q1.setPhno(Cur.getString(16));

        String latlng = Cur.getString(38);
        String[] arr = latlng.split(",");
        q1.setLat(Double.parseDouble(arr[0]));
        q1.setLng(Double.parseDouble(arr[1]));

    } catch (Exception e) {
        // TODO: handle exception
    }
    int c = Cur.getCount();
    return Cur;

}
}
07-06 23:14:38.934: E/AndroidRuntime(18851): FATAL EXCEPTION: main 07-06 23:14:38.934: E/AndroidRuntime(18851): java.lang.NullPointerException 07-06 23:14:38.934: E/AndroidRuntime(18851): at com.example.location_application_v1.CompDetail.onOptionsItemSelected(CompDetail.java:203) 07-06 23:14:38.934: E/AndroidRuntime(18851): at android.app.Activity.onMenuItemSelected(Activity.java:2593) 07-06 23:14:38.934: E/AndroidRuntime(18851): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1011) 07-06 23:14:38.934: E/AndroidRuntime(18851): at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735) 07-06 23:14:38.934: E/AndroidRuntime(18851): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149) 07-06 23:14:38.934: E/AndroidRuntime(18851): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) 07-06 23:14:38.934: E/AndroidRuntime(18851): at com.android.internal.view.menu.MenuPopupHelper.onItemClick(MenuPopupHelper.java:259) 07-06 23:14:38.934: E/AndroidRuntime(18851): at android.widget.AdapterView.performItemClick(AdapterView.java:301) 07-06 23:14:38.934: E/AndroidRuntime(18851): at android.widget.AbsListView.performItemClick(AbsListView.java:1139) 07-06 23:14:38.934: E/AndroidRuntime(18851): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2856) 07-06 23:14:38.934: E/AndroidRuntime(18851): at android.widget.AbsListView$1.run(AbsListView.java:3619) 07-06 23:14:38.934: E/AndroidRuntime(18851): at android.os.Handler.handleCallback(Handler.java:800) 07-06 23:14:38.934: E/AndroidRuntime(18851): at android.os.Handler.dispatchMessage(Handler.java:100) 07-06 23:14:38.934: E/AndroidRuntime(18851): at android.os.Looper.loop(Looper.java:194) 07-06 23:14:38.934: E/AndroidRuntime(18851): at android.app.ActivityThread.main(ActivityThread.java:5433) 07-06 23:14:38.934: E/AndroidRuntime(18851): at java.lang.reflect.Method.invokeNative(Native Method) 07-06 23:14:38.934: E/AndroidRuntime(18851): at java.lang.reflect.Method.invoke(Method.java:525) 07-06 23:14:38.934: E/AndroidRuntime(18851): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:922) 07-06 23:14:38.934: E/AndroidRuntime(18851): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:689) 07-06 23:14:38.934: E/AndroidRuntime(18851): at dalvik.system.NativeStart.main(Native Method)