2013-10-23 45 views
0

即時嘗試添加記錄到我的sqlite數據庫。如果您單擊「添加」,則打開一個DialogFragment。然後,當你在文本框中寫入一些信息並在Spinner中選擇一個選項時,它應該被添加到sqlite數據庫中。這工作,如果我從主要活動做。但是當我試圖從DialogFragment中找到同樣的東西時,我只得到FC。不能添加記錄到sqlite數據庫使用DialogFragment

DialogFragment代碼:

public class CustomDialogFragment extends DialogFragment { 

    Spinner spin; 
    EditText etNumber, etForwardNumber; 
    Boolean initialDisplay = true; 
    Database mDB = new Database(getActivity()); 
    Cursor c; 

public void DialogFragment(){ 
    // Empty constructor required for DialogFragment 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

    View view = getActivity().getLayoutInflater().inflate(R.layout.activity_dialog, null); 

    etNumber = (EditText)view.findViewById(R.id.etNumber); 
    etForwardNumber = (EditText)view.findViewById(R.id.etForwardNumber); 

    etNumber.setHint("Phone Number"); 
    etForwardNumber.setHint("Forward Number"); 

    etForwardNumber.setVisibility(View.GONE); 

    spin = (Spinner)view.findViewById(R.id.spOptions); 
    List<String> list = new ArrayList<String>(); 
    list.add("Block Call"); 
    list.add("Forward Call"); 

    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(getActivity(), 
      android.R.layout.simple_spinner_item, list); 
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spin.setAdapter(dataAdapter); 

    spin.setOnItemSelectedListener(new OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { 
      Log.d("DIALOGFRAGMENT", "Option selected: " + position); 
      if (position == 0) { 
       Log.d("LOG_TAG", "Block"); 
       etForwardNumber.setVisibility(View.GONE); 
       //Log.d("LOG_TAG", initialDisplay.toString()); 
       //initialDisplay = false; 
      }else { 
       Log.d("LOG_TAG", "Forward"); 
       etForwardNumber.setVisibility(View.VISIBLE); 
      } 
     } 
     @Override 
     public void onNothingSelected(AdapterView<?> parentView) { 
      // your code here 
     } 

    }); 

    builder.setMessage("") 
     .setTitle("Add a new number") 
     .setView(view); 
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
     //Hide the dialog 
     } 
    }); 
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      //Add records to sqlite database 
      mDB.open(); 
      String cname = "test"; 
      String caction = "Forward"; 
      //String cnumber = "Numbertoforward"; 
      ContentValues cv = new ContentValues(); 
      cv.put("cName", cname); 
      cv.put("cAction", caction); 
      //cv.put("cNumber", cnumber); 
      mDB.empInsert(cv); 
      c.requery(); 
     } 
    }); 

    return builder.create(); 
} 

/*@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    //Inflate the XML view for the help dialog fragment 
    //View view = inflater.inflate(R.layout.activity_dialog, container); 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

    // 2. Chain together various setter methods to set the dialog characteristics 
    /*builder.setMessage("Test msg") 
     .setTitle("Title"); 
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      // User clicked OK button 
     } 
    }); 
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      // User cancelled the dialog 
     } 
    });*/ 
    /*return view; 
    } */ 
} 

的logcat:

10-23 15:06:00.125: E/AndroidRuntime(14935): FATAL EXCEPTION: main 
10-23 15:06:00.125: E/AndroidRuntime(14935): java.lang.NullPointerException 
10-23 15:06:00.125: E/AndroidRuntime(14935): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) 
10-23 15:06:00.125: E/AndroidRuntime(14935): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 
10-23 15:06:00.125: E/AndroidRuntime(14935): at com.spxc.forwardcalls.Database.open(Database.java:23) 
10-23 15:06:00.125: E/AndroidRuntime(14935): at com.spxc.forwardcalls.CustomDialogFragment$3.onClick(CustomDialogFragment.java:90) 
10-23 15:06:00.125: E/AndroidRuntime(14935): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166) 
10-23 15:06:00.125: E/AndroidRuntime(14935): at android.os.Handler.dispatchMessage(Handler.java:99) 
10-23 15:06:00.125: E/AndroidRuntime(14935): at android.os.Looper.loop(Looper.java:137) 
10-23 15:06:00.125: E/AndroidRuntime(14935): at android.app.ActivityThread.main(ActivityThread.java:5103) 
10-23 15:06:00.125: E/AndroidRuntime(14935): at java.lang.reflect.Method.invokeNative(Native Method) 
10-23 15:06:00.125: E/AndroidRuntime(14935): at java.lang.reflect.Method.invoke(Method.java:525) 
10-23 15:06:00.125: E/AndroidRuntime(14935): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
10-23 15:06:00.125: E/AndroidRuntime(14935): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-23 15:06:00.125: E/AndroidRuntime(14935): at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:112) 
10-23 15:06:00.125: E/AndroidRuntime(14935): at dalvik.system.NativeStart.main(Native Method) 

任何幫助,非常感謝!

回答

0

很難說在起牀,但似乎你的數據庫沒有正確初始化。您應該將

添加到您的onCreateDialog方法中。在這裏移動它可以確保getActivity()返回一個上下文來初始化數據庫。

另外,我強烈建議有一個使用單例模式的某種DatabaseHelper類。因此,您可以更靈活地從應用程序的任何位置訪問數據庫。

+0

仍然得到FC,但數據被添加:) –

+0

錯誤是在c.requery();爲什麼會這樣呢? –

+0

[檢查此](http://developer.android.com/reference/android/database/Cursor.html#requery()) – balysv

相關問題