2012-06-11 4 views
0

내 응용 프로그램에 도움이 필요합니다. 텍스트 필드에 값을 저장하려고 할 때마다 버튼이 저장된 후 응용 프로그램 충돌이 발생합니다. 다음과 같은 클래스를 만들었습니다 : 이것은 주 활동 클래스입니다 (이 경우에는 요일의 경우 요행처럼 활동을 전환하기 위해 TabHost가 있습니다).데이터베이스에 값 삽입 (응용 프로그램 강제 종료)

package com.projekt; 

import android.app.TabActivity; 
import android.content.Intent; 
import android.content.res.Resources; 
import android.os.Bundle; 
import android.widget.TabHost; 

public class MainActivity extends TabActivity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     //--- TABHOST ---// 
     Resources res = getResources(); // Resource object to get Drawables 
     TabHost tabHost = getTabHost(); // The activity TabHost 
     TabHost.TabSpec spec; // Resusable TabSpec for each tab 
     Intent intent; // Reusable Intent for each tab 

     // Create an Intent to launch an Activity for the tab (to be reused) 
     intent = new Intent().setClass(this, PoniedzialekActivity.class); 
     // Initialize a TabSpec for each tab and add it to the TabHost 
     spec = tabHost.newTabSpec("Pn").setIndicator("Pn", 
          res.getDrawable(R.drawable.ic_launcher)) 
         .setContent(intent); 
     tabHost.addTab(spec); 

     // Do the same for the other tabs 
     intent = new Intent().setClass(this, WtorekActivity.class); 
     spec = tabHost.newTabSpec("Wt").setIndicator("Wt", 
          res.getDrawable(R.drawable.ic_launcher)) 
         .setContent(intent); 
     tabHost.addTab(spec); 

     intent = new Intent().setClass(this, SrodaActivity.class); 
     spec = tabHost.newTabSpec("Sr").setIndicator("Sr", 
          res.getDrawable(R.drawable.ic_launcher)) 
         .setContent(intent); 
     tabHost.addTab(spec); 

     intent = new Intent().setClass(this, CzwartekActivity.class); 
     spec = tabHost.newTabSpec("Cz").setIndicator("Cz", 
          res.getDrawable(R.drawable.ic_launcher)) 
         .setContent(intent); 
     tabHost.addTab(spec); 

     intent = new Intent().setClass(this, PiatekActivity.class); 
     spec = tabHost.newTabSpec("Pt").setIndicator("Pt", 
          res.getDrawable(R.drawable.ic_launcher)) 
         .setContent(intent); 
     tabHost.addTab(spec); 

     tabHost.setCurrentTab(0); 
     //--- END OF TABHOST ---// 

    } 
} 

이 내 DatabaseHelper 클래스입니다 : 이것은 (I 버튼 클릭에 원하는 위치에 "추가"나는 데이터베이스에 값을 추가하고 새로운 의도 시작)

을 내 PoniedzialekActivity이

package com.projekt; 


import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DatabaseHelper extends SQLiteOpenHelper { 
    private static final String DATABASE_NAME = "database.db"; 
    private static final int DATABASE_VERSION = 1; 
    public static final String TAG = "ProjectDatabase"; 

    final static String PN_TABLE = "Tablica Poniedzialek"; 
    static final String PN_KEY_ID = "_id"; 
    final static String PN_KEY_NAME ="name";       
    final static String PN_KEY_TYPE_OF_SESSION ="type_of_session"; 
    final static String PN_KEY_START_TIME ="start_time"; 
    final static String PN_KEY_END_TIME ="end_time"; 
    final static String PN_KEY_ROOM ="room"; 

    static final String WT_TABLE = "Tablica Wtorek"; 
    static final String WT_KEY_ID = "_id"; 
    static final String WT_KEY_NAME ="name"; 
    static final String WT_KEY_TYPE_OF_SESSION ="type_of_session"; 
    static final String WT_KEY_START_TIME ="start_time"; 
    static final String WT_KEY_END_TIME ="end_time"; 
    static final String WT_KEY_ROOM ="room"; 

    static final String SR_TABLE = "Tablica Sroda"; 
    static final String SR_KEY_ID = "_id"; 
    static final String SR_KEY_NAME ="name"; 
    static final String SR_KEY_TYPE_OF_SESSION ="type_of_session"; 
    static final String SR_KEY_START_TIME ="start_time"; 
    static final String SR_KEY_END_TIME ="end_time"; 
    static final String SR_KEY_ROOM ="room"; 

    static final String CZ_TABLE = "Tablica Czwartek"; 
    static final String CZ_KEY_ID = "_id"; 
    static final String CZ_KEY_NAME ="name"; 
    static final String CZ_KEY_TYPE_OF_SESSION ="type_of_session"; 
    static final String CZ_KEY_START_TIME ="start_time"; 
    static final String CZ_KEY_END_TIME ="end_time"; 
    static final String CZ_KEY_ROOM ="room"; 

    static final String PT_TABLE = "Tablica Piatek"; 
    static final String PT_KEY_ID = "_id"; 
    static final String PT_KEY_NAME ="name"; 
    static final String PT_KEY_TYPE_OF_SESSION ="type_of_session"; 
    static final String PT_KEY_START_TIME ="start_time"; 
    static final String PT_KEY_END_TIME ="end_time"; 
    static final String PT_KEY_ROOM ="room"; 

    //--- KONSTRUKTOR ---// 
    public DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    }   
    //--- POMOCNIK DO OTWIERANIA/AKTUALIZOWANIA BAZY DANYCH ---// 
    private DatabaseHelper dbhelper; 
    //--- ZMIENNA DO PRZECHOWYWANIA INSTANCJI BAZY DANYCH ---// 
    @SuppressWarnings("unused") 
    private SQLiteDatabase db; 

    //--- TWORZENIE TABLIC ---// 
    @Override 
    public void onCreate(SQLiteDatabase db) { 

     String pn_sql = "CREATE TABLE" + PN_TABLE + 
         "(PN_KEY_ID integer primary key autoincrement, " + 
         "PN_KEY_TYPE_OF_SESSION text, " + 
         "PN_KEY_NAME text, " + 
         "PN_KEY_START_TIME text, " + 
         "PN_KEY_END_TIME text, " + 
         "PN_KEY_ROOM text);"; 
     String wt_sql = "CREATE TABLE" + WT_TABLE + 
         "(WT_KEY_ID integer primary key autoincrement, " + 
         "WT_KEY_TYPE_OF_SESSION text, " + 
         "WT_KEY_NAME text, " + 
         "WT_KEY_START_TIME text, " + 
         "WT_KEY_END_TIME text, " + 
         "WT_KEY_ROOM text);"; 
     String sr_sql = "CREATE TABLE" + SR_TABLE + 
         "(SR_KEY_ID integer primary key autoincrement, " + 
         "SR_KEY_TYPE_OF_SESSION text, " + 
         "SR_KEY_NAME text, " + 
         "SR_KEY_START_TIME text, " + 
         "SR_KEY_END_TIME text, " + 
         "SR_KEY_ROOM text);"; 
     String cz_sql = "CREATE TABLE" + CZ_TABLE + 
         "(CZ_KEY_ID integer primary key autoincrement, " + 
         "CZ_KEY_TYPE_OF_SESSION text, " + 
         "CZ_KEY_NAME text, " + 
         "CZ_KEY_START_TIME text, " + 
         "CZ_KEY_END_TIME text, " + 
         "CZ_KEY_ROOM text);"; 
     String pt_sql = "CREATE TABLE" + PT_TABLE + 
         "(PT_KEY_ID integer primary key autoincrement, " + 
         "PT_KEY_TYPE_OF_SESSION text, " + 
         "PT_KEY_NAME text, " + 
         "PT_KEY_START_TIME text, " + 
         "PT_KEY_END_TIME text, " + 
         "PT_KEY_ROOM text);"; 

     db.execSQL(pn_sql); 
     db.execSQL(wt_sql); 
     db.execSQL(sr_sql); 
     db.execSQL(cz_sql); 
     db.execSQL(pt_sql); 
    } 
    @Override 
    //--- ON UPGRADE ---// 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     Log.w("Projekt", "aktualizacja z wersji " + oldVersion 
       + " do wersji " + newVersion + " (stare dane ulegna usunieciu) "); 
       db.execSQL("DROP TABLE IF EXISTS" + PN_TABLE); 
       db.execSQL("DROP TABLE IF EXISTS" + WT_TABLE); 
       db.execSQL("DROP TABLE IF EXISTS" + SR_TABLE); 
       db.execSQL("DROP TABLE IF EXISTS" + CZ_TABLE); 
       db.execSQL("DROP TABLE IF EXISTS" + PT_TABLE); 
     onCreate(db); 
    } 
    //--- OPEN DATABASE ---// 
    public void open() throws SQLiteException 
    { 
     try 
     { 
      db = dbhelper.getWritableDatabase(); 
     } 
     catch(SQLiteException ex) 
     { 
      db = dbhelper.getReadableDatabase(); 
     } 
    } 
    //--- CLOSE DATABASE ---// 
    public void close() 
     { 
      dbhelper.close(); 
     } 

} //--- KONIEC KLASY DatabaseHelper ---// 

입니다

package com.projekt; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 


public class PoniedzialekActivity extends Activity implements OnClickListener { 


    private Button butPnAdd;  
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.layout_poniedzialek); 
     butPnAdd = (Button) findViewById(R.id.butPnAdd); 
     butPnAdd.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     if(v.getId()==R.id.butPnAdd){ 
     Intent i = new Intent(PoniedzialekActivity.this,dodawaniePoniedzialek.class); 
     startActivity(i); 
     } 
    } 
} 

그리고 이것은 단순히 데이터베이스

값을 추가 내 dodawanieActivity입니다

이 (데이터베이스에 추가 값을 사용) 내 Poniedzialek 클래스

package com.projekt; 

public class Poniedzialek { 

    //private variables 
    int id; 
    String name; 
    String start_time; 
    String end_time; 
    String type_of_session; 
    String room; 


    // pusty constructor 
    public Poniedzialek(){ 

    } 

    // constructor 
    public Poniedzialek(int id, String name,String start_time,String end_time,String type_of_session,String room){ 
     this.id = id; 
     this.type_of_session = type_of_session; 
     this.name = name; 
     this.start_time = start_time; 
     this.end_time = end_time; 
     this.room = room; 
    } 

    // getting ID 
    public int getID(){ 
     return this.id; 
    } 

    // setting id 
    public void setID(int id){ 
     this.id = id; 
    } 

    // getting name 
    public String getName(){ 
     return this.name; 
    } 

    // setting name 
    public void setName(String name){ 
     this.name = name; 
    } 

    // getting start time 
    public String getStartTime(){ 
     return this.start_time; 
    } 

    // setting start time 
    public void setStartTime(String start_time){ 
     this.start_time = start_time; 
    } 

    // getting end time 
    public String getEndTime(){ 
     return this.end_time; 
    } 

    // setting end time 
    public void setEndTime(String end_time){ 
     this.end_time = end_time; 
    } 

    // getting type of session 
    public String getTypeOfSession(){ 
     return this.type_of_session; 
    } 

    // setting type of session 
    public void setTypeOfSession(String type_of_session){ 
     this.type_of_session = type_of_session; 
    } 

    // getting room 
    public String getRoom(){ 
     return this.room; 
    } 

    // setting room 
    public void setRoom(String room){ 
     this.room = room; 
    } 

} 

그리고 그런데

, 누군가가 내가 PoniedzialekActivity 출시 (또는 스위치, 몰라)에 표시 할 수있는 방법을 말해 줄 수 값을 표시입니다 데이터베이스에 일찍 넣는다.

06-11 13:08:49.104: D/PhoneWindow(331): couldn't save which view has focus because the focused view [email protected] has no id. 
06-11 13:08:50.784: I/Database(331): sqlite returned: error code = 1, msg = near "TABLETablica_Poniedzialek": syntax error 
06-11 13:08:50.784: E/Database(331): Failure 1 (near "TABLETablica_Poniedzialek": syntax error) on 0x2da910 when preparing 'CREATE TABLETablica_Poniedzialek(PN_KEY_ID integer primary key autoincrement, PN_KEY_TYPE_OF_SESSION text, PN_KEY_NAME text, PN_KEY_START_TIME text, PN_KEY_END_TIME text, PN_KEY_ROOM text);'. 
06-11 13:08:50.804: D/AndroidRuntime(331): Shutting down VM 
06-11 13:08:50.804: W/dalvikvm(331): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
06-11 13:08:50.815: E/AndroidRuntime(331): FATAL EXCEPTION: main 
06-11 13:08:50.815: E/AndroidRuntime(331): android.database.sqlite.SQLiteException: near "TABLETablica_Poniedzialek": syntax error: CREATE TABLETablica_Poniedzialek(PN_KEY_ID integer primary key autoincrement, PN_KEY_TYPE_OF_SESSION text, PN_KEY_NAME text, PN_KEY_START_TIME text, PN_KEY_END_TIME text, PN_KEY_ROOM text); 
06-11 13:08:50.815: E/AndroidRuntime(331): at android.database.sqlite.SQLiteDatabase.native_execSQL(Native Method) 
06-11 13:08:50.815: E/AndroidRuntime(331): at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1763) 
06-11 13:08:50.815: E/AndroidRuntime(331): at com.projekt.DatabaseHelper.onCreate(DatabaseHelper.java:117) 
06-11 13:08:50.815: E/AndroidRuntime(331): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:126) 
06-11 13:08:50.815: E/AndroidRuntime(331): at com.projekt.dodawaniePoniedzialek.addPnSession(dodawaniePoniedzialek.java:79) 
06-11 13:08:50.815: E/AndroidRuntime(331): at com.projekt.dodawaniePoniedzialek.onClick(dodawaniePoniedzialek.java:69) 
06-11 13:08:50.815: E/AndroidRuntime(331): at android.view.View.performClick(View.java:2485) 
06-11 13:08:50.815: E/AndroidRuntime(331): at android.view.View$PerformClick.run(View.java:9080) 
06-11 13:08:50.815: E/AndroidRuntime(331): at android.os.Handler.handleCallback(Handler.java:587) 
06-11 13:08:50.815: E/AndroidRuntime(331): at android.os.Handler.dispatchMessage(Handler.java:92) 
06-11 13:08:50.815: E/AndroidRuntime(331): at android.os.Looper.loop(Looper.java:123) 
06-11 13:08:50.815: E/AndroidRuntime(331): at android.app.ActivityThread.main(ActivityThread.java:3683) 
06-11 13:08:50.815: E/AndroidRuntime(331): at java.lang.reflect.Method.invokeNative(Native Method) 
06-11 13:08:50.815: E/AndroidRuntime(331): at java.lang.reflect.Method.invoke(Method.java:507) 
06-11 13:08:50.815: E/AndroidRuntime(331): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
06-11 13:08:50.815: E/AndroidRuntime(331): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
06-11 13:08:50.815: E/AndroidRuntime(331): at dalvik.system.NativeStart.main(Native Method) 

마지막 것은, 내가 내 PoniedzialekActivity에 데이터베이스에 넣어 값을 표시하고 작업을 얻을 수 없다 당신은 내가에 무엇을해야하는지 말해 줄 수 :

요청에

,이 로그 말한 이게 효과가 있니? 나는 막 다른 골목에있다. (이것은 내가 atm에서 일하기를 원하는 마지막 일이다.) 나는 그런 일을 시도했다. 도와주세요.

package com.projekt; 


import java.util.ArrayList; 
import java.util.List; 

import android.app.ListActivity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 


public class PoniedzialekActivity extends ListActivity implements OnClickListener { // now Extends ListActivity instead of Activity 
    /* ADDED */ 
    private DatabaseHelper dbhelper; 
    private SQLiteDatabase db; 
    /* DEDDA */ 
    private Button butPnAdd;  
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.layout_poniedzialek); 
     butPnAdd = (Button) findViewById(R.id.butPnAdd); 
     butPnAdd.setOnClickListener(this); 

     List<Poniedzialek> values = showPn(); 

     // Use the SimpleCursorAdapter to show the 
     // elements in a ListView 
     ArrayAdapter<Poniedzialek> pn_adapter = new ArrayAdapter<Poniedzialek>(this, 
       android.R.layout.simple_list_item_1, values); 
     setListAdapter(pn_adapter); 
    } 
    /* ADDED */ 
    public List<Poniedzialek> showPn(){ 
     List<Poniedzialek> pn_list = new ArrayList<Poniedzialek>(); 

     Cursor cursor = db.query(DatabaseHelper.PN_TABLE, null, null, null, null, null, null); 

     cursor.moveToFirst(); 
     while (!cursor.isAfterLast()) { 
      Poniedzialek pn = cursorToPoniedzialek(cursor); 
      pn_list.add(pn); 
      cursor.moveToNext(); 
     } 
     // Make sure to close the cursor 
     cursor.close(); 
     return pn_list; 
    } 
    private Poniedzialek cursorToPoniedzialek(Cursor cursor) { 
     Poniedzialek pn = new Poniedzialek(); 
     pn.setID(cursor.getInt(0)); 
     pn.setStartTime(cursor.getString(1)); 
     pn.setEndTime(cursor.getString(2)); 
     pn.setTypeOfSession(cursor.getString(3)); 
     pn.setName(cursor.getString(4)); 
     pn.setRoom(cursor.getString(5)); 
     return pn; 
    } 
    /* DEDDA */ 
    @Override 
    public void onClick(View v) { 
     if(v.getId()==R.id.butPnAdd){ 
     Intent i = new Intent(PoniedzialekActivity.this,dodawaniePoniedzialek.class); 
     startActivity(i); 
     } 
    } 
} 
+0

LogCat은 무엇이라고 말합니까? – Nikhil

+0

코드가 모호합니다. 게시하십시오 Logcat –

답변

1

테이블 생성이 엉망입니다. 설정 한 상수를 사용하고 있지 않으며 공백이 없습니다 (마지막으로 프로그램을 죽이는 것이므로).

이 :

String pn_sql = "CREATE TABLE" + PN_TABLE + 
        "(PN_KEY_ID integer primary key autoincrement, " + 
        "PN_KEY_TYPE_OF_SESSION text, " + 
        "PN_KEY_NAME text, " + 
        "PN_KEY_START_TIME text, " + 
        "PN_KEY_END_TIME text, " + 
        "PN_KEY_ROOM text);"; 

이되어야한다 테이블 생성 문장의 모든

String pn_sql = "CREATE TABLE " + PN_TABLE + 
        "(" + PN_KEY_ID + " integer primary key autoincrement, " + 
        PN_KEY_TYPE_OF_SESSION + " text, " + 
        PN_KEY_NAME + " text, " + 
        PN_KEY_START_TIME + " text, " + 
        PN_KEY_END_TIME + " text, " + 
        PN_KEY_ROOM + " text);"; 

를 반복합니다.

+0

감사합니다. 코드 내에서 거짓말을 한 것은 잘못된 것임을 지적한 것 같습니다. 이 정적 인 정적 문자열'static final String PT_TABLE = "Tablica Piatek";도 오류의 원인이되었습니다 (소문자를 추가해야 함). 응용 프로그램을 더 이상 닫지 않아도됩니다. – user1420709

+0

반갑습니다. 여기에 다소 익숙하기 때문에이 링크 [http://meta.stackexchange.com/a/5235/187716] (이전에 본 적이없는 경우)를 통해 이해를 돕겠습니다. 사물이 어떻게 작동하는지 더 잘 알 수 있습니다. – Barak

관련 문제