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 "
+ ");";
이 열이 처음 외래 키이었다
검색어 앞에'Log.d ("Meter ID", MeterTableDetails.METER_ID);'를 입력하고 결과를 확인하십시오. 나는 그것이 당신의'NULL'이고 당신의 DB에 실제로 존재하지 않는다고 추측하고 있습니다. 거기에 무엇이 있는지 다시 확인하기 위해'SQLite Browser'를 가져야합니다 ... – nathansizemore
@nathansizemore 고맙습니다. 내 코드를 디버깅하는 데 도움이되었습니다. 마침내 해결했습니다. 매우 바보 같은 실수 – naffie
다른 사람들이 이 문제를 알 수있는 도움을 얻을 수있는보기 – nathansizemore