2013-10-22 5 views
0

데이터를 데이터베이스에 삽입하려고하는데 테이블이 없다고 알려줍니다. 또한 응용 프로그램 안에 또 다른 sqlite 데이터베이스가 있는데,이 문제에 영향을 주는지 확신 할 수 없지만 그렇게 생각하지는 않습니다. 동일한 데이터베이스 이름을 사용하지만 다른 테이블 이름을 사용합니다. 그것이 영향을 미친다고 생각한다면 나에게 말해줘. 나는 그 코드도 게시 할 것이다. 로그 캣은 나에게 이러한 메시지 제공 :Eclipse가 SQLite 데이터베이스에 데이터를 삽입하는 테이블이 없습니다.

(1) no such table: notes 
Error inserting title=Bleh desc=bleh 
android.database.sqlite.SQLiteException: no such table: notes (code 1): , while   compiling: INSERT INTO notes(title,desc) VALUES (?,?) 
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) 
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) 
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467) 
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339) 
at com.example.stepsaway.NoteActivity.addEntry(NoteActivity.java:102) 
at com.example.stepsaway.NoteActivity.onClick(NoteActivity.java:75) 
at android.view.View.performClick(View.java:4240) 
at android.view.View$PerformClick.run(View.java:17721) 
at android.os.Handler.handleCallback(Handler.java:730) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5103) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:525) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
at dalvik.system.NativeStart.main(Native Method) 

활동 자바는 다음과 같습니다

public class NoteActivity extends Activity implements OnClickListener { 

Button buttonLeaveNote; 

private EditText mTitle; 
private EditText mDesc; 

protected NoteDBHelper noteDB = new NoteDBHelper(NoteActivity.this); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_note); 

    buttonLeaveNote = (Button) findViewById(R.id.buttonLeaveNote); 
    buttonLeaveNote.setOnClickListener(this); 

    mTitle = (EditText)findViewById(R.id.etitle); 
    mDesc = (EditText)findViewById(R.id.edesc); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.note, menu); 
    return true; 
} 

@Override 
public void onClick(View v) { 
    switch(v.getId()){ 

    case R.id.buttonLeaveNote: 

      String title = mTitle.getText().toString(); 
      String desc = mDesc.getText().toString(); 


      boolean invalid = false; 

      if(title.equals("")) 
      { 
      invalid = true; 
      Toast.makeText(getApplicationContext(), "Please enter a title", Toast.LENGTH_SHORT).show(); 
      } 
      else 
       if(desc.equals("")) 
       { 
        invalid = true; 
        Toast.makeText(getApplicationContext(), "Please enter description", Toast.LENGTH_SHORT).show(); 

       } 

       else 

        if(invalid == false) 
        { 
         addEntry(title, desc); 
         Intent i_note = new Intent(NoteActivity.this, JustWanderingActivity.class); 
         startActivity(i_note); 
         //finish(); 
         } 

         break; 
         } 
        } 

public void onDestroy() 
{ 
    super.onDestroy(); 
    noteDB.close(); 
} 

private void addEntry(String title, String desc) 
{ 
    SQLiteDatabase notedb = noteDB.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
     values.put("title", title); 
     values.put("desc", desc); 
     //values.put("lati", lati); 
     //values.put("lng", lng); 
     try 
     { 
     long newRowId; 
     newRowId = notedb.insert(NoteDBHelper.DATABASE_TABLE_NAME, null, values); 

     Toast.makeText(getApplicationContext(), "Note successfully added", Toast.LENGTH_SHORT).show(); 
     } 

     catch(Exception e) 
     { 
     e.printStackTrace(); 
     } 
} 

public void onNothingSelected(AdapterView<?> arg0) { 
    // TODO Auto-generated method stub 

} 
} 

그리고 데이터베이스 자바는 다음과 같습니다

public class NoteDBHelper extends SQLiteOpenHelper 

{ 
private SQLiteDatabase notedb; 

public static final String NOTE_ID = "_nid"; 
public static final String NOTE_TITLE = "title"; 
public static final String NOTE_DESC = "desc"; 
public static final String NOTE_LAT = "lati"; 
public static final String NOTE_LONG = "lng"; 


NoteDBHelper noteDB = null; 
private static final String DATABASE_NAME = "stepsaway.db"; 
private static final int DATABASE_VERSION = 2; 
public static final String DATABASE_TABLE_NAME = "notes"; 


private static final String DATABASE_TABLE_CREATE = 
     "CREATE TABLE " + DATABASE_TABLE_NAME + "(" + 
     "_nid INTEGER PRIMARY KEY AUTOINCREMENT," + 
     "title TEXT NOT NULL, desc LONGTEXT NOT NULL);"; 

public NoteDBHelper(Context context) { 

super(context, DATABASE_NAME, null, DATABASE_VERSION); 
System.out.println("In constructor"); 
} 


@Override 
public void onCreate(SQLiteDatabase notedb) { 

try{ 

notedb.execSQL(DATABASE_TABLE_CREATE); 


}catch(Exception e){ 
e.printStackTrace(); 
} 
} 



@Override 
public void onUpgrade(SQLiteDatabase notedb, int oldVersion, int newVersion) { 
// TODO Auto-generated method stub 

} 




public Cursor rawQuery(String string, String[] strings) { 
// TODO Auto-generated method stub 
return null; 
} 




public void open() { 

getWritableDatabase(); 
} 


public Cursor getDetails(String text) throws SQLException 
{ 

Cursor mCursor = 
     notedb.query(true, DATABASE_TABLE_NAME, 
      new String[]{NOTE_ID, NOTE_TITLE, NOTE_DESC}, 
      NOTE_TITLE + "=" + text, 
      null, null, null, null, null); 
if (mCursor != null) 
{ 
    mCursor.moveToFirst(); 
} 
return mCursor; 


} 
} 

어떤 도움을 주시면 감사하겠습니다, 감사합니다.

편집 : 문제는 동일한 데이터베이스 이름 내에 두 번째 테이블을 만드는 것 같습니다. 그것은 내가 두 번째 것을 만들게하지 않을 것이다. DB를 처음 만드는 것은 정상적으로 작동하지만 다른 테이블을 만들려고 할 때 SQLite Exception에 그러한 테이블이 없다. 두 번째 테이블을 만들기 위해 변경하거나 추가해야 할 코드가 있습니까? 모두 내가 동일한 DATABASE_NAME 있지만 다른 DATABASE_TABLE_NAME 함께 다른 sqlite 데이터베이스 Java 만들었 기 때문에.

+0

당신은 전에 테이블 – SathishKumar

+1

을 생성 여부를 확인 않았고 테이블을 추가하면 나중에이 문제가 발생할 수 있습니다. 테이블은 DB가 처음 생성 될 때 만들어집니다. 그래서 장치에서 응용 프로그램의 데이터를 제거하거나 청소하고 다시 실행하십시오. – osayilgan

+0

오사와간, 와우, 고마워! 이 문제를 해결 : ( 편집 : 새로운 문제가 생겼어. 동일한 데이터베이스에서 두 번째 테이블을 만드는 문제가 나타납니다. 어떤 이유로 작동하지 않습니다. 사용자를 등록 할 하나의 테이블 및 다른 테이블이 여기에 게시되어 메모를 작성하는 것입니다. – user2905867

답변

2

nodeDB 개체를 만들 때 가장 좋은 추측은 활동을 계속 사용할 수 없다는 것입니다. 따라서 테이블 생성에 실패하게됩니다.

당신은 내부 onCreate()에 noteDB를 초기화하는 방법을 이동 시도 할 수 있습니다

:

protected NoteDBHelper noteDB; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_note); 

    noteDB = new NoteDBHelper(NoteActivity.this); 


    buttonLeaveNote = (Button) findViewById(R.id.buttonLeaveNote); 
    buttonLeaveNote.setOnClickListener(this); 

    mTitle = (EditText)findViewById(R.id.etitle); 
    mDesc = (EditText)findViewById(R.id.edesc); 
} 
+0

많은 사람들이 이렇게합니다. 'super.onCreate()'호출이 완료 될 때까지 컨텍스트를 사용할 수 없습니다. – d3m0li5h3r

+0

시도했지만 여전히 같은 테이블이없는 동일한 예외가 발생합니다. – user2905867

+0

이것은 좋은 조언입니다. 만약 이것이 OP의 문제라면, 보통 getBaseContext()에 NPE가 생길 것입니다.이 경우 NPE가 아닌 이유는'SQLiteOpenHelper'는 실제로 컨텍스트를 사용하지 않는다는 것입니다 나중에 사용하기 위해 저장합니다 (예 : 'getWritableDatabase()'가 호출됩니다). – laalto

1

귀하의 onUpgrade() 비어 있고 데이터베이스 스키마 버전 2. 내 생각 엔이 데이터베이스의 초기 버전을 가지고 있지 않았다입니다 notes 테이블에 추가하고 나중에 추가 할 때 빈 업그레이드 코드가 테이블을 추가 할 수 없습니다. 그러나 SQLiteOpenHelper은 현재 데이터베이스의 버전 2를 실행 중이므로 만족합니다.

앱을 한 번 수정하려면 앱 데이터를 삭제하십시오. 예 : 설정 앱에서 앱 관리 -> 다운로드 -> 앱 선택 후 '애플리케이션 데이터 지우기'버튼을 클릭하십시오. 또는 앱을 제거하고 다시 설치하기 만하면됩니다. 이 접근법은 개발하는 동안 충분히 좋습니다.

출시 된 버전에서 수정하려면 onUpgrade()을 구현하여 데이터베이스 스키마를 업데이트하고 필요한 데이터 마이그레이션을 수행하십시오. 데이터 손실이 염려되지 않으면 이전 테이블에서 DROP TABLE으로 전화 한 다음 onCreate()으로 전화하여 테이블을 다시 만들면됩니다.


여러 테이블과 관련된 후속 질문 : 동일한 도우미 클래스를 사용하여 데이터베이스를 관리하기 만하면됩니다. 데이터베이스 파일 당 하나의 도우미. onCreate()에 모든 테이블을 만들고 onUpgrade()에 필요한 마이그레이션을 수행하십시오. 첫 번째 문제에 관해서는

+0

귀하의 답변이 합리적이고 타당합니다. – ariefbayu

0

: 내 의견에 설명 된대로>

  • 당신이 전에 DB를 생성하고 테이블을 추가하면 나중에이 문제를 야기 할 수 있습니다. 테이블은 DB가 처음 생성 될 때 만들어집니다. 그래서 장치에서 응용 프로그램의 데이터를 제거하거나 청소하고 다시 실행하십시오.두 번째 문제를 들어

:

  • 테이블을 작성하려면, 당신은 이미 당신이 가지고있는 테이블하고 있다는 것을 동일한 작업을 수행.

    @Override

    공공 무효에서 onCreate (의 SQLiteDatabase notedb) {

    시도 {

    notedb.execSQL(DATABASE_TABLE_CREATE); 
    
    notedb.execSQL(DATABASE_TABLE_CREATE_STRING_2); 
    

    } 캐치 (예외 전자) { e.printStackTrace(); 당신은 DB를 생성 한 경우

}

} 는

관련 문제