在SQLite数据库中保存SSID数据导致强制关闭

问题描述:

我试图用附加数据(用户当前的SSID)更新我的数据库,但是当试图保存数据库时 - 整个应用程序强制关闭。在SQLite数据库中保存SSID数据导致强制关闭

我知道有一个NullPointer异常正在导致保存数据 - 但我不知道我做了什么错误导致它。

的logcat:

04-04 21:24:08.351: E/AndroidRuntime(10745): FATAL EXCEPTION: AsyncTask #2 
04-04 21:24:08.351: E/AndroidRuntime(10745): java.lang.RuntimeException: An error occured while executing doInBackground() 
04-04 21:24:08.351: E/AndroidRuntime(10745): at android.os.AsyncTask$3.done(AsyncTask.java:299) 
04-04 21:24:08.351: E/AndroidRuntime(10745): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
04-04 21:24:08.351: E/AndroidRuntime(10745): at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
04-04 21:24:08.351: E/AndroidRuntime(10745): at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
04-04 21:24:08.351: E/AndroidRuntime(10745): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
04-04 21:24:08.351: E/AndroidRuntime(10745): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
04-04 21:24:08.351: E/AndroidRuntime(10745): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
04-04 21:24:08.351: E/AndroidRuntime(10745): at java.lang.Thread.run(Thread.java:856) 
04-04 21:24:08.351: E/AndroidRuntime(10745): Caused by: java.lang.NullPointerException 
04-04 21:24:08.351: E/AndroidRuntime(10745): at com.app.gamedemo.AddEditDevice.saveContact(AddEditDevice.java:117) 
04-04 21:24:08.351: E/AndroidRuntime(10745): at com.app.gamedemo.AddEditDevice.access$1(AddEditDevice.java:111) 
04-04 21:24:08.351: E/AndroidRuntime(10745): at com.app.gamedemo.AddEditDevice$1$1.doInBackground(AddEditDevice.java:83) 
04-04 21:24:08.351: E/AndroidRuntime(10745): at android.os.AsyncTask$2.call(AsyncTask.java:287) 
04-04 21:24:08.351: E/AndroidRuntime(10745): at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
04-04 21:24:08.351: E/AndroidRuntime(10745): ... 4 more 

来源:(更新W¯¯SCF的建议)

ADDEDITDEVICE.java

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.net.wifi.WifiInfo; 
import android.net.wifi.WifiManager; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.ViewGroup; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.FrameLayout; 
import android.widget.TextView; 
import android.widget.TimePicker; 
import java.text.DecimalFormat; 


public class AddEditDevice extends Activity { 

    private long rowID; 
    private EditText nameEt; 
    private EditText capEt; 
    private EditText codeEt; 
    private TimePicker timeEt; 
    private TextView ssidTextView; 


     // @Override 
     public void onCreate(Bundle savedInstanceState) 
     { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.add_country); 
      WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
      WifiInfo info = wifi.getConnectionInfo(); 
      String ssidString = info.getSSID(); 

      //TextView ssidTextView = (TextView) findViewById(R.id.wifiSSID); 
      ssidTextView = (TextView) findViewById(R.id.wifiSSID); 
      ssidTextView.setText(ssidString); 

      nameEt = (EditText) findViewById(R.id.nameEdit); 
      capEt = (EditText) findViewById(R.id.capEdit); 
      codeEt = (EditText) findViewById(R.id.codeEdit); 
      timeEt = (TimePicker) findViewById(R.id.timeEdit); 






      Bundle extras = getIntent().getExtras(); 

      if (extras != null) 
      { 
      rowID = extras.getLong("row_id"); 
      nameEt.setText(extras.getString("name")); 
      capEt.setText(extras.getString("cap")); 
      codeEt.setText(extras.getString("code"));  
      String time = extras.getString("time"); 
      String[] parts = time.split(":"); 
      timeEt.setCurrentHour(Integer.valueOf(parts[0])); 
      timeEt.setCurrentMinute(Integer.valueOf(parts[1])); 
      timeEt.setIs24HourView(false); 


      } 

      Button saveButton =(Button) findViewById(R.id.saveBtn); 
      saveButton.setOnClickListener(new OnClickListener() { 

       public void onClick(View v) 
       { 
       if (capEt.getText().length() != 0) 
       { 
        AsyncTask<Object, Object, Object> saveContactTask = 
         new AsyncTask<Object, Object, Object>() 
         { 
          @Override 
          protected Object doInBackground(Object... params) 
          { 
          saveContact(); 
          return null; 
          } 

          @Override 
          protected void onPostExecute(Object result) 
          { 
          finish(); 
          } 
         }; 

        saveContactTask.execute((Object[]) null); 
       } 

       else 
       { 
        AlertDialog.Builder alert = new AlertDialog.Builder(AddEditDevice.this); 
        alert.setTitle(R.string.errorTitle); 
        alert.setMessage(R.string.errorMessage); 
        alert.setPositiveButton(R.string.errorButton, null); 
        alert.show(); 
       } 
       } 
     });} 




      private void saveContact() 
      { 
       DatabaseConnector dbConnector = new DatabaseConnector(this); 

       if (getIntent().getExtras() == null) 
       { 
        dbConnector.insertContact(nameEt.getText().toString(), 
          capEt.getText().toString(), 
          timeEt.getCurrentHour().toString() + ":" 
           + timeEt.getCurrentMinute().toString(), 
          codeEt.getText().toString(), 
         ssidTextView.getText().toString()); 

       } 
       else 
       { 
       dbConnector.updateContact(rowID, 
         nameEt.getText().toString(), 
          capEt.getText().toString(), 
           timeEt.getCurrentHour().toString() + ":" 
            + timeEt.getCurrentMinute().toString(), 
           codeEt.getText().toString(), 
           ssidTextView.getText().toString()); 
       } 
      } 
} 

来源:

DatabaseConnector.java

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 


public class DatabaseConnector { 

    private static final String DB_NAME = "WorldCountries"; 
    private SQLiteDatabase database; 
    private DatabaseOpenHelper dbOpenHelper; 

    public DatabaseConnector(Context context) { 
     dbOpenHelper = new DatabaseOpenHelper(context, DB_NAME, null, 1); 
    } 

     public void open() throws SQLException 
     { 
      //open database in reading/writing mode 
      database = dbOpenHelper.getWritableDatabase(); 
     } 

     public void close() 
     { 
      if (database != null) 
      database.close(); 
     }  

     public void insertContact(String name, String cap, String code, String time, String ssid) 
       { 
        ContentValues newCon = new ContentValues(); 
        newCon.put("name", name); 
        newCon.put("cap", cap); 
        newCon.put("time", time); 
        newCon.put("code", code); 
        newCon.put("ssid", ssid); 

        open(); 
        database.insert("country", null, newCon); 
        close(); 
       } 


       public void updateContact(long id, String name, String cap, String code, String time, String ssid) 
       { 
        ContentValues editCon = new ContentValues(); 
        editCon.put("name", name); 
        editCon.put("cap", cap); 
        editCon.put("time", time); 
        editCon.put("code", code); 
        editCon.put("ssid", ssid); 

        open(); 
        database.update("country", editCon, "_id=" + id, null); 
        close(); 
       } 


       public Cursor getAllContacts() 
       { 
        return database.query("country", new String[] {"_id", "name"}, 
        null, null, null, null, "name"); 
       } 

       public Cursor getOneContact(long id) 
       { 
        return database.query("country", null, "_id=" + id, null, null, null, null); 
       } 

       public void deleteContact(long id) 
       { 
        open(); 
        database.delete("country", "_id=" + id, null); 
        close(); 
       } 
} 
+0

尝试将数据存储到数据库之前引发NullPointerException。您需要检查AddEditDevice.java:117中可能为null的内容,并且可能会将变量和调用分开(用于调试) – MByD 2013-04-04 23:51:48

+0

添加行时会导致此问题:ssid.getText()。toString()); 但我不知道如何解决该问题。 – 2013-04-04 23:55:54

我认为你的问题是你将TextView保存到本地变量“ssidTextView”中,而你应该将它保存到“ssid”字段中。 只是改变

TextView ssidTextView = (TextView) findViewById(R.id.wifiSSID); 

ssid = (TextView) findViewById(R.id.wifiSSID); 

当然,你也将有 “字符串SSID” 重命名成别的东西,说: “ssidString”。

+0

我按照你的建议更新了我的源码 - 但是现在我收到了两个新的错误:ssidString无法解析为变量,ssidTextView无法解析 – 2013-04-05 00:29:49

+0

在“ssidString”前添加“String”。 – scf 2013-04-05 00:36:36

+0

你原来的问题是,你给了两个不同的变量同名,“ssid”。在未来避免这种情况,你会为自己节省很多麻烦。 – scf 2013-04-05 00:37:41