2016-03-30 37 views
0

这是我的数据库创建的地方。我使用了一个全局变量,它在登录时接受用户名,然后我根据该用户名创建一个表。 当我尝试输入数据到数据库时,它给了我一个错误,说没有这样的表存在。如果我手动增加数据库版本,它的工作原理!每次创建新表时,是否必须增加数据库版本?如果是这样,我怎么能做到这一点?为什么我每次向sqlite数据库添加新表时都必须增加数据库版本?

非常时间一个新用户注册一个新表添加来保存用户信息,在调试时,我必须手动进入我的代码并增加数据库版本,每次添加一个新用户时,有没有更好的方法这样做?否则,用户将能够登录,但将无法输入任何信息,直到我进入我的代码,并增加数据库版本..谢谢

package com.example.victor.kidsrewards; 
import android.app.Activity; 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.content.Intent; 
import android.os.Bundle; 

/** 
* Created by Victor on 3/20/2016. 
*/ 
public class TaskSQLiteHelper extends SQLiteOpenHelper { 
    String _username = Globals._username; 

    public TaskSQLiteHelper(Context context){ 
     super(context, "tasks_db", null, 8); 

    } 


    @Override 
    public void onCreate(SQLiteDatabase db) { 
     //create a table 

     db.execSQL("CREATE TABLE tasks_"+_username + " (_id INTEGER PRIMARY KEY , task TEXT NOT NULL, points INTEGER NOT NULL)"); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS tasks_"+_username+";"); 
     this.onCreate(db); 
    } 

} 

这是我的跟踪

03-30 14:18:25.217 6450-6450/com.example.victor.kidsrewards E/SQLiteLog: (1) no such table: tasks_JOE 
03-30 14:18:25.217 6450-6450/com.example.victor.kidsrewards D/AndroidRuntime: Shutting down VM 
03-30 14:18:25.221 6450-6450/com.example.victor.kidsrewards W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x94d5eb20) 
03-30 14:18:25.221 6450-6450/com.example.victor.kidsrewards E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.victor.kidsrewards, PID: 6450 
android.database.sqlite.SQLiteException: no such table: tasks_JOE (code 1): , while compiling: SELECT _id, task, points FROM tasks_JOE 
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.SQLiteQuery.<init>(SQLiteQuery.java:37) 
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) 
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314) 
at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161) 
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032) 
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1200) 
at com.example.victor.kidsrewards.TaskDataBase.getTasks(TaskDataBase.java:59) 
at com.example.victor.kidsrewards.TaskList.onActivityCreated(TaskList.java:46) 
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1983) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1092) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252) 
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) 
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617) 
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517) 
at android.os.Handler.handleCallback(Handler.java:733) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:136) 
at android.app.ActivityThread.main(ActivityThread.java:5045) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
at dalvik.system.NativeStart.main(Native Method) 
+0

您不必为了更改数据库架构而增加版本,事实上,我建议不要这样做。版本增量应该只发生在已发布应用程序的更新上,而不是在它仍处于开发阶段。您可以在设置的应用信息页面中使用“清除数据”选项,或者卸载并重新安装应用。 –

+0

是的同意你@MikeM ..但它应该考虑所有情况。我们必须向他通报DB版本概念背后的真正原因。 –

+0

请仔细阅读已经提出的问题,或者只是做一些谷歌搜索,你就会知道这是更新数据库的定义方式。而已。没有什么让人困惑或没有什么复杂的。因此将其标记为重复以消除不必要的重复。 – MKJParekh

回答

0

为了在Android中升级数据库,您应该将DATABASE_VERSION增加1,以便SQLOpenHelper知道它必须调用onUpgrade方法。

否则你的表不会添加和旧的数据库将被使用。

+0

。应用程序将删除您的旧数据库文件并创建新的更改,因此,无论何时在数据库文件中进行更改时,都必须增加版本。 – Abhishek

+0

@Abhishek是约定 –

+0

非常时间一个新用户注册一个新表被添加来保存用户信息,在调试时,我必须手动进入我的代码并增加数据库版本,每次我添加一个新用户,是否有一个更好的方式来做到这一点?否则,用户将能够登录但不能输入任何信息,直到我访问我的代码并增加数据库版本。谢谢。 – vhdz04

相关问题