2013-10-22 108 views
0

我試圖插入數據到數據庫,但它告訴我沒有這樣的表。我也有應用程序內的另一個SQLite數據庫,我不知道這是否影響這一個,但我不這麼認爲。它使用相同的數據庫名稱,但使用不同的表名稱。如果您認爲它確實會影響它,請告訴我,我也會爲此發佈代碼。 的logcat的給我這些消息: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) 

的活動是java:

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 

} 
} 

和數據庫Java是:

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; 


} 
} 

任何幫助,將不勝感激,謝謝。

編輯:看起來問題是在相同的數據庫名稱內創建第二個表。它不會讓我創建第二個。第一次創建數據庫工作正常,但它嘗試創建另一個表時,SQLite異常沒有這樣的表。是否需要修改或添加一些代碼來創建第二個表?因爲我所做的只是使用相同的DATABASE_NAME創建另一個sqlite數據庫java,但使用了另一個DATABASE_TABLE_NAME。

+0

你檢查表是否創建或不 – SathishKumar

+1

如果您已經創建了DB之前並添加表之後這可能會導致問題。表格是在第一次創建數據庫時創建的。因此,從設備上卸載或清除應用程序中的數據並再次運行。 – osayilgan

+0

@osayilgan哦哇,謝謝!這解決了這個問題(: 編輯︰我有一個新的問題,雖然我看到問題是在同一個數據庫中創建第二個表,它不起作用,我有一個表註冊用戶,另一個表表是在這裏發佈的,用於創建筆記 – user2905867

回答

2

我最好的猜測是當您創建nodeDB對象時,該活動仍不可用。因此你將無法創建表格。

你可以嘗試移動你如何初始化noteDB到裏面onCreate()

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的問題,那麼通常會導致NPE在'getBaseContext()'中。爲什麼在這種情況下NPE不是'SQLiteOpenHelper'實際上不使用* CON中的'Context'它只是存儲它以備後用(例如, '調用getWritableDatabase()')。 – laalto

1

onUpgrade()是空的,數據庫架構版本爲2。我的猜測是,你的數據庫的最初版本沒有了notes表以及稍後添加時,空的升級代碼無法添加它。但是SQLiteOpenHelper被滿足,因爲它現在正在運行數據庫的版本2。

要修復一次,請清理您的應用程序數據。例如。在設置應用程序中,轉到管理應用程序 - >下載 - >選擇您的應用程序,然後單擊「清除應用程序數據」按鈕。或者只是卸載並重新安裝應用程序。這種方法在開發過程中已經足夠了。

要修復它的發佈版本,請實施onUpgrade(),以便更新數據庫模式並進行任何必要的數據遷移。如果您不擔心數據丟失,則可以在舊錶上撥打DROP TABLE,然後致電onCreate()重新創建表。


關於多個表的後續問題:只需使用相同的助手類來管理數據庫。每個數據庫文件一個助手。創建onCreate()中的所有表並在onUpgrade()中執行任何所需的遷移。

+0

你的答案是有道理的和有效的 – ariefbayu

0

關於到第一個問題:我在評論解釋>

  • 如果您已經創建了DB之前並添加表之後這可能會導致問題。表格是在第一次創建數據庫時創建的。因此,從設備上卸載或清除應用程序中的數據並再次運行。

對於第二個問題:

  • 如果你想創建一個表,做同樣的,你已經這樣做了,你有表。

    @Override

    公共無效的onCreate(SQLiteDatabase notedb){

    嘗試{

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

    }趕上(例外五){e.printStackTrace (); }

}

相關問題