2014-04-01 2 views
0

내 응용 프로그램이 충돌하고 코드를 샅샅이 뒤졌지만이 오류가 재귀 적으로 발생합니다. 내 테이블의 기본 키 열이 왜 PK인지, 자동 증가하는지 알 수 없습니다.활동을 일시 중지 할 수 없습니다. SQLiteConstraintEcxeption 열이 NULL이 아니어야합니다. (코드 19)

04-01 17:48:30.413: E/AndroidRuntime(2317): java.lang.RuntimeException: Unable to pause activity {com.isys.waterbillingsystem/com.isys.waterbillingsystem.AccountsDetailsActivity}:  android.database.sqlite.SQLiteConstraintException: customers.customerMeterId may not be NULL (code 19) 
04-01 17:48:30.413: E/AndroidRuntime(2317): Caused by: android.database.sqlite.SQLiteConstraintException: customers.customerMeterId may not be NULL (code 19) 
04-01 17:48:30.413: E/AndroidRuntime(2317):  at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method) 
04-01 17:48:30.413: E/AndroidRuntime(2317): at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782) 
04-01 17:48:30.413: E/AndroidRuntime(2317):  at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788) 
04-01 17:48:30.413: E/AndroidRuntime(2317):  at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86) 

문제는 무엇을 할 수 :

@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public class AccountsDetailsActivity extends ActionBarActivity { 
private EditText meterNumber; 
private EditText plotNumber; 
private EditText Name; 
private EditText phone; 
private EditText address; 
private EditText account; 

private Uri userUri; 
private ArrayList<String>meters_list = new ArrayList<String>(); 

private ArrayList<String>plots_list = new ArrayList<String>(); 


@Override 
protected void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 
    setContentView(R.layout.insert_user); 

    // get action bar 
    android.app.ActionBar actionBar = getActionBar(); 

    // Enabling Up/Back navigation 
    actionBar.setDisplayHomeAsUpEnabled(true); 

    String[] projection = new String[] { MeterTableDetails.METER_ID,MeterTableDetails.METER_NUMBER,MeterTableDetails.PLOT_NUMBER}; 


    Cursor cursor = getContentResolver().query(UserAccountsContentProvider.CONTENT_URI_METER, projection, null, null, 
      null); 

    if (cursor != null) { 

     cursor.moveToFirst(); 
     String meter = cursor.getString(cursor 
       .getColumnIndexOrThrow(MeterTableDetails.METER_NUMBER)); 
     String plot = cursor.getString(cursor 
       .getColumnIndexOrThrow(MeterTableDetails.PLOT_NUMBER)); 

     plots_list.add(plot); 
     meters_list.add(meter); 
     cursor.close(); 
    } 
    final ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_spinner_item, meters_list); 

    final ArrayAdapter<String> plotAdapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_spinner_item, plots_list); 

    meterNumber = (EditText) findViewById(R.id.insert_meter_number_user); 

    meterNumber.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (!hasFocus) { 
       hideKeyboard(v); 
      } 
     } 
    }); 
    meterNumber.setOnClickListener(new OnClickListener(){ 

     @Override 
     public void onClick(View v) { 


      new AlertDialog.Builder(AccountsDetailsActivity.this) 
      .setTitle("Select Meter") 
      .setAdapter(dataAdapter, new DialogInterface.OnClickListener() { 

       public void onClick(DialogInterface dialog, int which) { 
        meterNumber.setText(meters_list.toString()); 
       dialog.dismiss(); 
       } 
      }).create().show(); 

     } 
    }); 
    plotNumber = (EditText) findViewById(R.id.insert_plot_user); 
    plotNumber.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (!hasFocus) { 
       hideKeyboard(v); 
      } 
     } 
    }); 

    plotNumber.setOnClickListener(new OnClickListener(){ 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      new AlertDialog.Builder(AccountsDetailsActivity.this) 
      .setTitle("Select Plot Number") 
      .setAdapter(plotAdapter, new DialogInterface.OnClickListener() { 

       public void onClick(DialogInterface dialog, int which) { 
        plotNumber.setText(plots_list.toString()); 
       dialog.dismiss(); 
       } 
      }).create().show(); 

     } 

    }); 
    Name = (EditText) findViewById(R.id.insert_name_edit); 
    Name.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (!hasFocus) { 
       hideKeyboard(v); 
      } 
     } 
    }); 

    address = (EditText) findViewById(R.id.insert_address); 
    address.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (!hasFocus) { 
       hideKeyboard(v); 
      } 
     } 
    }); 

    account = (EditText) findViewById(R.id.insert_accountNumber); 
    account.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (!hasFocus) { 
       hideKeyboard(v); 
      } 
     } 
    }); 

    phone = (EditText) findViewById(R.id.insert_phone); 
    phone.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (!hasFocus) { 
       hideKeyboard(v); 
      } 
     } 
    }); 
    Button confirmButton = (Button) findViewById(R.id.btn_insert_user); 

    Bundle extras = getIntent().getExtras(); 

    // check from the saved Instance 
    userUri = (bundle == null) ? null 
      : (Uri) bundle 
        .getParcelable(UserAccountsContentProvider.CONTENT_ITEM_ACCOUNT_TYPE); 

    // or if passed from other activities 
    if (extras != null) { 

     userUri = extras 
       .getParcelable(UserAccountsContentProvider.CONTENT_ITEM_ACCOUNT_TYPE); 

     fillData(userUri); 



    } 

    confirmButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (TextUtils.isEmpty(Name.getText().toString())) { 

       makeToast(); 

      } else if (TextUtils.isEmpty(meterNumber.getText().toString())) { 

       makeToast(); 
      } else if (TextUtils.isEmpty(plotNumber.getText().toString())) { 
       makeToast(); 

      } else if (TextUtils.isEmpty(address.getText().toString())) { 
       makeToast(); 

      } 
      else if (TextUtils.isEmpty(account.getText().toString())) { 
       makeToast(); 

      }else if (TextUtils.isEmpty(phone.getText().toString())) { 
       makeToast(); 

      }else { 

       setResult(RESULT_OK); 
       finish(); 
      } 

     } 

     private void makeToast() { 

      Toast.makeText(AccountsDetailsActivity.this, 
        "Please enter all fields", Toast.LENGTH_LONG).show(); 

     } 

    }); 
    } 


private void fillData(Uri uri) { 

    String[] projection = new String[] { AccountsTableDetails.KEY_CUSTOMER_ID, 
      AccountsTableDetails.KEY_LAST_NAME, 
      AccountsTableDetails.KEY_METER_NUMBER, 
      AccountsTableDetails.KEY_PLOT_NUMBER, 
      AccountsTableDetails.KEY_ADDRESS, 
      AccountsTableDetails.KEY_PHONE_NUMBER, 
      AccountsTableDetails.KEY_ACCOUNT_NUMBER}; 

    Cursor cursor = getContentResolver().query(uri, projection, null, null, 
      null); 

    if (cursor != null) { 
     cursor.moveToFirst(); 

     Name.setText(cursor.getString(cursor 
       .getColumnIndexOrThrow(AccountsTableDetails.KEY_LAST_NAME))); 
     meterNumber.setText(cursor.getString(cursor 
       .getColumnIndexOrThrow(AccountsTableDetails.KEY_METER_NUMBER))); 
     plotNumber.setText(cursor.getString(cursor 
       .getColumnIndexOrThrow(AccountsTableDetails.KEY_PLOT_NUMBER))); 
     address.setText(cursor.getString(cursor 
       .getColumnIndexOrThrow(AccountsTableDetails.KEY_ADDRESS))); 

     phone.setText(cursor.getString(cursor 
       .getColumnIndexOrThrow(AccountsTableDetails.KEY_PHONE_NUMBER))); 


     account.setText(cursor.getString(cursor 
       .getColumnIndexOrThrow(AccountsTableDetails.KEY_ACCOUNT_NUMBER))); 

     // always close the cursor 
     cursor.close(); 
    } 

} 

private void hideKeyboard(View v) { 
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); 
    inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0); 

} 

protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    saveState(); 
    outState.putParcelable(
      UserAccountsContentProvider.CONTENT_ITEM_ACCOUNT_TYPE, 
      userUri); 
} 

private void saveState() { 
    String name = Name.getText().toString(); 
    String meter = meterNumber.getText().toString(); 
    String plot = plotNumber.getText().toString(); 
    String Address = address.getText().toString(); 
    String Account = account.getText().toString(); 
    String Phone = phone.getText().toString(); 

    // only save if either name or account number 
    // is available 

    if (name.length() == 0 && Account.length() == 0) { 
     return; 
    } 

    ContentValues values = new ContentValues(); 
    values.put(AccountsTableDetails.KEY_LAST_NAME, name); 
    values.put(AccountsTableDetails.KEY_METER_NUMBER, meter); 
    values.put(AccountsTableDetails.KEY_PLOT_NUMBER, plot); 
    values.put(AccountsTableDetails.KEY_ADDRESS, Address); 
    values.put(AccountsTableDetails.KEY_ACCOUNT_NUMBER, Account); 
    values.put(AccountsTableDetails.KEY_PHONE_NUMBER, Phone); 

    if (userUri == null) { 
     // New item 
     userUri = getContentResolver().insert(
       UserAccountsContentProvider.CONTENT_URI_ACCOUNTS, 
       values); 
    } else { 
     // Update meter 
     getContentResolver().update(userUri, values, null, null); 
    } 

} 

@Override 
protected void onPause() { 
    super.onPause(); 
    saveState(); 
} 


} 

이것은 로그 캣입니까?

// Database creation SQL statement for customers table 
    private static final String CREATE_TABLE_CUSTOMERS = "create table " 
      + TABLE_CUSTOMERS 
      + "(" 
      + KEY_CUSTOMER_ID + " integer primary key autoincrement, " 
      + KEY_FIRST_NAME + " text, " 
      + KEY_LAST_NAME + " text, " 
      + KEY_ADDRESS + " varchar, " 
      + KEY_EMAIL + " varchar, " 
      + KEY_PHONE_NUMBER + " integer, " 
      + KEY_ACCOUNT_NUMBER + " integer, " 
      + KEY_CUSTOMER_METER_ID + " integer not null, " 
      + KEY_METER_NUMBER + " integer not null, " 
      + KEY_PLOT_NUMBER + " varchar not null " 

      + ");"; 

이 열이 처음 외래 키이었다

+1

검색어 앞에'Log.d ("Meter ID", MeterTableDetails.METER_ID);'를 입력하고 결과를 확인하십시오. 나는 그것이 당신의'NULL'이고 당신의 DB에 실제로 존재하지 않는다고 추측하고 있습니다. 거기에 무엇이 있는지 다시 확인하기 위해'SQLite Browser'를 가져야합니다 ... – nathansizemore

+0

@nathansizemore 고맙습니다. 내 코드를 디버깅하는 데 도움이되었습니다. 마침내 해결했습니다. 매우 바보 같은 실수 – naffie

+0

다른 사람들이 이 문제를 알 수있는 도움을 얻을 수있는보기 – nathansizemore

답변

0

이 솔루션은 매우 작은 mistake.In 내 고객 테이블이었다, 나는

정수 null가 아닌 아래에 원하는대로 customerMeterId 열을 설정했다 미터라고하는 다른 테이블에서 삽입되었습니다.이 테이블의 meter_id가이 열에 삽입됩니다. 그 이유는 정수가 null이 아니기 때문입니다. 그러나 그 부분을 편집하는 것을 잊어 버린 구조를 변경했습니다. 알지 못해서 테이블에 넣으려고 할 때마다 customerMeterId가 null이 아닐 수도 있습니다.

난 그냥 설명에서 널 (null)이 아닌 을 제거하고 지금 null 값을 받아 들일 수 .Meaning 정수로 떠났다 해결하려면.

관련 문제