My Query is about cursors. 다음 코드를 실행하면 프로그램에서 NUllPointerException이 발생합니다.
public class MySQLiteHelper extends SQLiteOpenHelper {
public MySQLiteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}
public static final String DATABASE_NAME = "Exp.db";
public static final int DATABASE_VERSION = 1;
private static final String KEY_ID = "ROW_ID";
private static final String KEY_DESCRIP = "ITEM_DESCRIPTION";
private static final String KEY_AMOUNT = "ITEM_AMOUNT";
private static final String KEY_TABLE_NAME = "ITEMS";
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("create table ITEMS(ROW_ID integer primary key autoincrement,ITEM_DESCRIPTION text,ITEM_AMOUNT text);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS ITEMS");
this.onCreate(db);
}
public void createEntry(ExpenseObject exp) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(KEY_AMOUNT, exp.Amt);
cv.put(KEY_DESCRIP, exp.Desc);
db.insert(KEY_TABLE_NAME, null, cv);
db.close();
}
public String getAllEntry() {
SQLiteDatabase db = this.getReadableDatabase();
String[] columns=new String[]{KEY_ID,KEY_DESCRIP,KEY_AMOUNT};
Cursor cx=db.query(KEY_TABLE_NAME, columns, null, null, null, null, null);
String result=" ";
int rowid=cx.getColumnIndex(KEY_ID);
int amt=cx.getColumnIndex(KEY_AMOUNT);
int desc=cx.getColumnIndex(KEY_DESCRIP);
for(cx.moveToFirst();!cx.isAfterLast();cx.moveToNext())
{
result= result + " " + cx.getString(rowid) + " " +cx.getString(desc) + " " + cx.getString(amt) + " \n " ;
}
cx.close();
return result;
}
logcat 파일은 다음과 같습니다.
D/dalvikvm(4318): GC_FOR_ALLOC freed 77K, 6% free 2943K/3120K, paused 57ms, total 67ms
D/AndroidRuntime(4318): Shutting down VM
W/dalvikvm(4318): threadid=1: thread exiting with uncaught exception (group=0x414c4700)
E/AndroidRuntime(4318): FATAL EXCEPTION: main
E/AndroidRuntime(4318): java.lang.NullPointerException
E/AndroidRuntime(4318): at com.example.expensesdatabase.MainActivity.onClick(MainActivity.java:61)
E/AndroidRuntime(4318):at android.view.View.performClick(View.java:4240)
E/AndroidRuntime(4318):at android.view.View$PerformClick.run(View.java:17721)
E/AndroidRuntime(4318):at android.os.Handler.handleCallback(Handler.java:730)
E/AndroidRuntime(4318):at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(4318):at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(4318):at android.app.ActivityThread.main(ActivityThread.java:5103)
E/AndroidRuntime(4318):at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(4318):at java.lang.reflect.Method.invoke(Method.java:525)
E/AndroidRuntime(4318):at com.an>droid.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:737)
E/AndroidRuntime(4318):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/AndroidRuntime(4318):at dalvik.system.NativeStart.main(Native Method)
주요 활동 파일은 다음과 같습니다.
public class MainActivity extends Activity implements View.OnClickListener {
EditText desc,amt,r;
Button enter,bview;
TextView s1,i1,a1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
desc=(EditText) findViewById(R.id.eDesc);
amt=(EditText) findViewById(R.id.eAmt);
enter=(Button) findViewById(R.id.bEnter);
bview=(Button) findViewById(R.id.bview);
s1=(TextView) findViewById(R.id.tvid1);
a1=(TextView) findViewById(R.id.tvamt1);
i1=(TextView) findViewById(R.id.tvitem1);
r=(EditText) findViewById(R.id.editText1);
enter.setOnClickListener(this);
bview.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onClick(View v) {
ExpenseObject e ;
MySQLiteHelper h=new MySQLiteHelper(this);
switch(v.getId()){
case R.id.bEnter:
String d=desc.getText().toString();
String ab=amt.getText().toString();
e =new ExpenseObject(d,ab);
h.createEntry(e);
Dialog x=new Dialog(this);
x.setTitle("Success");
TextView tv= new TextView(this);
tv.setText("Entry created");
x.setContentView(tv);
x.setCancelable(true);
x.show();
break;
case R.id.bview:
setContentView(R.layout.view_database);
String result=h.getAllEntry();
r.setText(result);
break;
}
}
}
또한 SQLdatabaseViewer를 사용하여 데이터베이스를 확인하여 데이터가 제대로 입력되었는지 확인했습니다. 그리고 내가 입력 한 정확한 항목을 보여주었습니다. 왜 여전히 nullPointer 예외가 발생하는지 모르겠습니다. 이 오류가 발생하는 이유와 해결 방법을 알려주세요. 감사합니다.
여기에서:
ContentValues cv = new ContentValues();
cv.put(KEY_AMOUNT, exp.Amt);
cv.put(KEY_DESCRIP, exp.Desc);
db.insert(KEY_TABLE_NAME, null, cv);
exp.Desc
null 일 수 있으며 바인딩 할 수 없습니다. 바인딩 인수 인덱싱은 1에서 시작하므로 인덱스 2의 바인딩 문제는 두 번째 바인딩 인수를 참조합니다.
또한 여기에서 커서에는 두 개의 열이 있습니다.
private static final String[] columns = { KEY_DESCRIP, KEY_AMOUNT };
Cursor cx = db.query(KEY_TABLE_NAME, columns, null, null, null, null, null);
하지만 세 가지를 요청합니다.
int rowid=cx.getColumnIndex(KEY_ID);
int amt=cx.getColumnIndex(KEY_AMOUNT);
int desc=cx.getColumnIndex(KEY_DESCRIP);
열 인덱스 -1을 사용하려고 할 때 결국 다른 예외가 발생합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다