2013-10-22 109 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 (); }

}

相关问题