package hjh.data.db;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class SqliteDBTestActivity extends Activity {
/** Called when the activity is first created. */
private Button createB, dropB, insertB, updateB, deleteB, selectB;
private EditText et1, et2, et3;
private SQLiteDatabase db;
private final static String DB_NAME="hjh.db"; //DB name setting
private final static int DB_MODE=Context.MODE_PRIVATE;
private final static String T_NAME="address";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
createB = (Button)findViewById(R.id.b01);
dropB = (Button)findViewById(R.id.b02);
insertB = (Button)findViewById(R.id.b03);
updateB = (Button)findViewById(R.id.b04);
deleteB = (Button)findViewById(R.id.b05);
selectB = (Button)findViewById(R.id.bselect);
createB.setOnTouchListener(this); 로그보면 36라인에 오류가 널값오류가뜨는데 이유를 모르겠습니다.
dropB.setOnTouchListener(this);
insertB.setOnTouchListener(this);
updateB.setOnTouchListener(this);
deleteB.setOnTouchListener(this);
selectB.setOnTouchListener(this);
et1 = (EditText)findViewById(R.id.et01);
et2 = (EditText)findViewById(R.id.et02);
et3 = (EditText)findViewById(R.id.et03);
openDB();
}
//DB open
private void openDB(){
db = openOrCreateDatabase(DB_NAME, DB_MODE, null);
showToast("DB("+DB_NAME+")생성 or 열림");
}
//Message
private void showToast(String msg) {
// TODO Auto-generated method stub
Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if(v == createB){
createTable();
}else if(v == dropB){
dropTable();
}else if(v == insertB){
insertData();
}else if(v == updateB){
updateData();
}else if(v == deleteB){
deleteData();
}else{ //v == selectB
selectData();
}
return false;
}
//SQL Process
private boolean execSQL(String sql){
try{
db.execSQL(sql);
return true;
}catch (SQLException se) {
// TODO: handle exception
return false;
}
}
//Data Select
private void selectData() {
// TODO Auto-generated method stub
String sql = "SELECT _id, name, addr FROM ";
sql += T_NAME;
sql += " WHERE _id = ";
sql += et1.getText().toString();
Log.e("selectData(): ",sql);
try{
Cursor cur = db.rawQuery(sql, null);
cur.moveToFirst();
if(cur.getCount() > 0){
et2.setText(cur.getString(1));
et3.setText(cur.getString(cur.getColumnIndex("addr")));
}else{
showToast("조회 데이타가 없습니다.");
}
}catch (SQLException se) {
// TODO: handle exception
Log.e("selectData()Error! : ",se.toString());
}
}
//Data Delete
private void deleteData() {
// TODO Auto-generated method stub
String sql = "DELETE FROM ";
sql += T_NAME;
sql += " WHERE _id = ";
sql += et1.getText().toString();
if(!this.execSQL(sql)){
showToast("Data("+T_NAME+")delete Error!");
}else{
showToast("Data("+T_NAME+")delete OK!");
}
}
//Data Update
private void updateData() {
// TODO Auto-generated method stub
String sql = "UPDATE ";
sql += T_NAME;
sql += " SET ";
sql += " name = '";
sql += et2.getText().toString();
sql += "', addr = '";
sql += et3.getText().toString();
sql += "' WHERE _id = ";
sql += et1.getText().toString();
if(!this.execSQL(sql)){
showToast("Data("+T_NAME+")update Error!");
}else{
showToast("Data("+T_NAME+")update OK!");
}
}
//Data Insert
private void insertData() {
// TODO Auto-generated method stub
String sql = "INSERT INTO ";
sql += T_NAME;
sql += "(name,addr,ddate) VALUES ( '";
sql += et2.getText().toString();
sql += "', '";
sql += et3.getText().toString();
sql += "', ";
sql += "date('now') )";
if(!this.execSQL(sql)){
showToast("Data("+T_NAME+")insert Error!");
}else{
showToast("Data("+T_NAME+")insert OK!");
}
}
//Table Drop
private void dropTable() {
// TODO Auto-generated method stub
String sql = "drop table ";
sql += T_NAME;
try{
db.execSQL(sql);
showToast("Table("+T_NAME+")삭제 완료!");
}catch (SQLException se) {
// TODO: handle exception
Log.e("dropTable()Error! : ",se.toString());
}
}
//Table Create
private void createTable() {
// TODO Auto-generated method stub
String sql = "create table ";
sql += T_NAME;
sql += "(_id integer primary key autoincrement, name text not null, ";
sql += "addr text default 'seoul', ddate date)";
try{
db.execSQL(sql);
showToast("Table("+T_NAME+")생성 완료!");
}catch (SQLException se) {
// TODO: handle exception
//Log.e("createTable()시오류 : ",se.toString());
}
}
}
로그
05-25 02:22:11.686: ERROR/Zygote(32): setreuid() failed. errno: 2
05-25 02:22:18.218: ERROR/Zygote(32): setreuid() failed. errno: 17
05-25 02:22:19.307: ERROR/BatteryService(58): usbOnlinePath not found
05-25 02:22:19.307: ERROR/BatteryService(58): batteryVoltagePath not found
05-25 02:22:19.307: ERROR/BatteryService(58): batteryTemperaturePath not found
05-25 02:22:19.326: ERROR/SurfaceFlinger(58): Couldn't open /sys/power/wait_for_fb_sleep or /sys/power/wait_for_fb_wake
05-25 02:22:24.217: ERROR/EventHub(58): could not get driver version for /dev/input/mouse0, Not a typewriter
05-25 02:22:24.217: ERROR/EventHub(58): could not get driver version for /dev/input/mice, Not a typewriter
05-25 02:22:24.467: ERROR/System(58): Failure starting core service
05-25 02:22:24.467: ERROR/System(58): java.lang.SecurityException
05-25 02:22:24.467: ERROR/System(58): at android.os.BinderProxy.transact(Native Method)
05-25 02:22:24.467: ERROR/System(58): at android.os.ServiceManagerProxy.addService(ServiceManagerNative.java:146)
05-25 02:22:24.467: ERROR/System(58): at android.os.ServiceManager.addService(ServiceManager.java:72)
05-25 02:22:24.467: ERROR/System(58): at com.android.server.ServerThread.run(SystemServer.java:184)
05-25 02:22:25.316: ERROR/SoundPool(58): error loading /system/media/audio/ui/Effect_Tick.ogg
05-25 02:22:25.316: ERROR/SoundPool(58): error loading /system/media/audio/ui/KeypressStandard.ogg
05-25 02:22:25.327: ERROR/SoundPool(58): error loading /system/media/audio/ui/KeypressSpacebar.ogg
05-25 02:22:25.327: ERROR/SoundPool(58): error loading /system/media/audio/ui/KeypressDelete.ogg
05-25 02:22:25.327: ERROR/SoundPool(58): error loading /system/media/audio/ui/KeypressReturn.ogg
05-25 02:22:27.156: ERROR/ThrottleService(58): Could not open GPS configuration file /etc/gps.conf
05-25 02:22:28.955: ERROR/logwrapper(144): executing /system/bin/tc failed: No such file or directory
05-25 02:22:29.026: ERROR/logwrapper(145): executing /system/bin/tc failed: No such file or directory
05-25 02:22:29.127: ERROR/logwrapper(146): executing /system/bin/tc failed: No such file or directory
05-25 02:22:37.542: ERROR/HierarchicalStateMachine(58): TetherMaster - unhandledMessage: msg.what=3
05-25 02:22:56.763: ERROR/AndroidRuntime(263): FATAL EXCEPTION: main
05-25 02:22:56.763: ERROR/AndroidRuntime(263): java.lang.RuntimeException: Unable to start activity ComponentInfo{hjh.data.db/hjh.data.db.SqliteDBTestActivity}: java.lang.NullPointerException
05-25 02:22:56.763: ERROR/AndroidRuntime(263): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
05-25 02:22:56.763: ERROR/AndroidRuntime(263): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
05-25 02:22:56.763: ERROR/AndroidRuntime(263): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
05-25 02:22:56.763: ERROR/AndroidRuntime(263): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
05-25 02:22:56.763: ERROR/AndroidRuntime(263): at android.os.Handler.dispatchMessage(Handler.java:99)
05-25 02:22:56.763: ERROR/AndroidRuntime(263): at android.os.Looper.loop(Looper.java:123)
05-25 02:22:56.763: ERROR/AndroidRuntime(263): at android.app.ActivityThread.main(ActivityThread.java:4627)
05-25 02:22:56.763: ERROR/AndroidRuntime(263): at java.lang.reflect.Method.invokeNative(Native Method)
05-25 02:22:56.763: ERROR/AndroidRuntime(263): at java.lang.reflect.Method.invoke(Method.java:521)
05-25 02:22:56.763: ERROR/AndroidRuntime(263): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-25 02:22:56.763: ERROR/AndroidRuntime(263): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-25 02:22:56.763: ERROR/AndroidRuntime(263): at dalvik.system.NativeStart.main(Native Method)
05-25 02:22:56.763: ERROR/AndroidRuntime(263): Caused by: java.lang.NullPointerException
05-25 02:22:56.763: ERROR/AndroidRuntime(263): at hjh.data.db.SqliteDBTestActivity.onCreate(SqliteDBTestActivity.java:36)
05-25 02:22:56.763: ERROR/AndroidRuntime(263): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-25 02:22:56.763: ERROR/AndroidRuntime(263): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
05-25 02:22:56.763: ERROR/AndroidRuntime(263): ... 11 more
05-25 02:25:44.632: ERROR/AndroidRuntime(340): FATAL EXCEPTION: main
05-25 02:25:44.632: ERROR/AndroidRuntime(340): java.lang.RuntimeException: Unable to start activity ComponentInfo{hjh.data.db/hjh.data.db.SqliteDBTestActivity}: java.lang.NullPointerException
05-25 02:25:44.632: ERROR/AndroidRuntime(340): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
05-25 02:25:44.632: ERROR/AndroidRuntime(340): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
05-25 02:25:44.632: ERROR/AndroidRuntime(340): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
05-25 02:25:44.632: ERROR/AndroidRuntime(340): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
05-25 02:25:44.632: ERROR/AndroidRuntime(340): at android.os.Handler.dispatchMessage(Handler.java:99)
05-25 02:25:44.632: ERROR/AndroidRuntime(340): at android.os.Looper.loop(Looper.java:123)
05-25 02:25:44.632: ERROR/AndroidRuntime(340): at android.app.ActivityThread.main(ActivityThread.java:4627)
05-25 02:25:44.632: ERROR/AndroidRuntime(340): at java.lang.reflect.Method.invokeNative(Native Method)
05-25 02:25:44.632: ERROR/AndroidRuntime(340): at java.lang.reflect.Method.invoke(Method.java:521)
05-25 02:25:44.632: ERROR/AndroidRuntime(340): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-25 02:25:44.632: ERROR/AndroidRuntime(340): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-25 02:25:44.632: ERROR/AndroidRuntime(340): at dalvik.system.NativeStart.main(Native Method)
05-25 02:25:44.632: ERROR/AndroidRuntime(340): Caused by: java.lang.NullPointerException
05-25 02:25:44.632: ERROR/AndroidRuntime(340): at hjh.data.db.SqliteDBTestActivity.onCreate(SqliteDBTestActivity.java:36)
05-25 02:25:44.632: ERROR/AndroidRuntime(340): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-25 02:25:44.632: ERROR/AndroidRuntime(340): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
05-25 02:25:44.632: ERROR/AndroidRuntime(340): ... 11 more
05-25 02:26:08.992: ERROR/AndroidRuntime(357): FATAL EXCEPTION: main
05-25 02:26:08.992: ERROR/AndroidRuntime(357): java.lang.RuntimeException: Unable to start activity ComponentInfo{hjh.data.db/hjh.data.db.SqliteDBTestActivity}: java.lang.NullPointerException
05-25 02:26:08.992: ERROR/AndroidRuntime(357): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
05-25 02:26:08.992: ERROR/AndroidRuntime(357): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
05-25 02:26:08.992: ERROR/AndroidRuntime(357): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
05-25 02:26:08.992: ERROR/AndroidRuntime(357): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
05-25 02:26:08.992: ERROR/AndroidRuntime(357): at android.os.Handler.dispatchMessage(Handler.java:99)
05-25 02:26:08.992: ERROR/AndroidRuntime(357): at android.os.Looper.loop(Looper.java:123)
05-25 02:26:08.992: ERROR/AndroidRuntime(357): at android.app.ActivityThread.main(ActivityThread.java:4627)
05-25 02:26:08.992: ERROR/AndroidRuntime(357): at java.lang.reflect.Method.invokeNative(Native Method)
05-25 02:26:08.992: ERROR/AndroidRuntime(357): at java.lang.reflect.Method.invoke(Method.java:521)
05-25 02:26:08.992: ERROR/AndroidRuntime(357): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-25 02:26:08.992: ERROR/AndroidRuntime(357): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-25 02:26:08.992: ERROR/AndroidRuntime(357): at dalvik.system.NativeStart.main(Native Method)
05-25 02:26:08.992: ERROR/AndroidRuntime(357): Caused by: java.lang.NullPointerException
05-25 02:26:08.992: ERROR/AndroidRuntime(357): at hjh.data.db.SqliteDBTestActivity.onCreate(SqliteDBTestActivity.java:36)
05-25 02:26:08.992: ERROR/AndroidRuntime(357): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-25 02:26:08.992: ERROR/AndroidRuntime(357): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
05-25 02:26:08.992: ERROR/AndroidRuntime(357): ... 11 more
createB가 null이에요.주석처리하면 그 밑라인들도 null값이 들어가네요..
어떤분은 리스너 쪽에 문제가 있다고 하시던데.. 제가 초보라 잘몰라서요.
이상하네요 위소스만 보면 분명히 컴파일 자체가 안될텐데..
onTouchListener를 사용하려면 클래스 선언부에 implements를 명시해줘야하거든요..;; 위에 import에도 안보이고 말이죠.
어쨌든 createB가 null인 경우라면 main.xml에 id정의가 안되있거나, xml이 꼬였을 문제가 있구요(그럴경우 main.xml 새로고침 이후 상단 project - clean 하시면 해결..)
createB가 아니라 리스너쪽에 문제가 있다면 위에 말한것처럼 컴파일 자체가 안됐을 가능성이 많습니다.
implements OnTouchListener을 넣지 않아도 에뮬레이터에서 실행은 됬었는데요. 이때 로그보시면 36라인이 에러라고 나옵니다.
말씀하신대로 implements OnTouchListener 문구를 넣고 실행시켰더니 xml24라인이 문제라고 나오는데요. xml을 main하고 styles 두개로 나눠놨는데 같이 올려볼게요. ㅠ
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="SQLite Test"
android:textSize="12pt"
android:gravity="center"/>
<Button
android:id="@+id/b01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="테이블생성"/>
<Button
android:id="@+id/b02"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="테이블삭제"/>
<LinearLayout
style="@+style/ll">
<Button
android:id="@+id/b03"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="입력"
android:layout_weight="1"/>
<Button
android:id="@+id/bselect"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="조회"
android:layout_weight="1"/>
<Button
android:id="@+id/b04"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="수정"
android:layout_weight="1"/>
<Button
android:id="@+id/b05"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="삭제"
android:layout_weight="1"/>
</LinearLayout>
<LinearLayout
style="@+style/ll">
<TextView
style="@+style/tv"
android:text="번호"/>
<EditText
android:id="@+id/et01"
style="@+style/et"
android:hint="ex)자동증가키"/>
</LinearLayout>
<LinearLayout
style="@+style/ll">
<TextView
style="@+style/tv"
android:text="이름"/>
<EditText
android:id="@+id/et02"
style="@+style/et"
android:hint="ex)홍길동"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10px">
<TextView
style="@+style/tv"
android:text="주소"/>
<EditText
android:id="@+id/et03"
style="@+style/et"
android:hint="ex)서울시"/>
</LinearLayout>
</LinearLayout>
styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="et">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
</style>
<style name="tv">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textSize">12pt</item>
</style>
<style name="ll">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:orientation">horizontal</item>
<item name="android:layout_marginTop">10px</item>
</style>
</resources>
style을 레이아웃으로 통채로 감싸서 이렇게 사용하는건 안써봐서 확실치않지만...
밑에 styles.xml을 res/values 밑에 만드셨다면 main.xml에서는
참조할 때 style="@+style/ll"이 아닌 style="@style/ll"로 표기하셔야 할 겁니다.
res/values 밑에 만들긴했는데요...
포도맛 카라님이 말씀하신대로 style="@style/ll" 이렇게 사용하면 xml에 오류가뜨네요.
main.xml에서
android:id="@+id/b01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="테이블생성"/>
이런식으로 되어있어요.
음 이상하군요.. style폴더에 xml을 설정하면 각 resource들이 R파일에 name 속성으로 등록이 되기때문에
main에서는 +style이 아닌 그냥 style을 써야되는 게 이치에 맞을 것 같거든요..
@+style or @+id 와 @style or @id 의 차이는
전자는 새로 해당하는 리소스를 만들때 쓰여지는거고 후자는 미리 만들어진 리소스(R파일에서 확인 가능)를 참조하라는 뜻이거든요.
그래서 @+style/ll 로 main.xml에서 쓰여지면. main xml이 파싱되는 순간 R파일에 쓰여지고, styles.xml에서 'name=ll' 로 쓰여지는 순간 또 다시 쓰여져 중복이 될 가능성이 높죠..
xml이 꼬였거나 R파일이 styles.xml의 오류로 제대로 생성되지 않았을 가능성이 높습니다.
1. styles.xml을 우선 res/values/ 밑에 위치시키시고 저장 후 우측클릭으로 새로고침하세요
2. 그리고나서 /gen/R.java 파일을 클릭하여 class style 영역 안에 ll, tv, et가 선언되어 있는지 확인하시구요
3. 위 과정 진행, 확인 후 main.java에서 다시한번 문법상의 오류가 없는지 확인 하시고 전처럼 우측마우스클릭 새로고침하세요
4. 상단 project- clean 을 하셔서 현재 프로젝트를 리빌딩해보세요..
이렇게 해도 안되면 ';' 저는 GG입니다.





createB 가 null인것 아닌가요?