我更改了数据库版本,为SQL函数添加了适当数量的空间以创建表并更新了将输入插入数据库的函数的参数,但LogCat仍然显示:
E/SQLiteLog: (1) no such table: reg_info
E/SQLiteDatabase: Error inserting user_password=e user_email=e user_name=e
While compiling: INSERT INTO reg_info(user_password,user_email,user_name)
我缩小了错误显示的信息,只关注这些特定的错误。在模拟器和Android设备上会出现此问题。谢谢。
这是我的合同类,我在其中声明了我的表的所有列:
package com.example.xxx.datadigger;
import android.provider.BaseColumns;
public final class TableData
{
public TableData()
{
}
public static abstract class TableInfo implements BaseColumns
{
public static final String DATABASE_NAME="user_info";
public static final String TABLE_NAME="reg_info";
public static final String KEY_ID = "id";
public static final String USER_NAME = "user_name";
public static final String USER_PASSWORD = "user_password";
public static final String USER_CON = "user_con";
public static final String USER_EMAIL = "user_email";
}
}
这是我尝试创建表并插入数据插入的地方:
package com.example.xxx.datadigger;
import android.app.ActionBar;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.TabWidget;
public class DatabaseOperations extends SQLiteOpenHelper{
public static final int database_version = 2;
private static final String TEXT_TYPE = " TEXT";
private static final String COMMA_SEP = ", ";
private static final String CREATE_QUERY = "CREATE TABLE "
+ TableData.TableInfo.TABLE_NAME + " ("
+ TableData.TableInfo.KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ TableData.TableInfo.USER_EMAIL + TEXT_TYPE + COMMA_SEP
+ TableData.TableInfo.USER_NAME + TEXT_TYPE + COMMA_SEP
+ TableData.TableInfo.USER_PASSWORD + TEXT_TYPE + COMMA_SEP
+ "); ";
public DatabaseOperations(Context context) {
super(context, TableData.TableInfo.DATABASE_NAME, null, database_version);
Log.d("Database Operations", "Database created");
}
@Override
public void onCreate(SQLiteDatabase sdb) {
sdb.execSQL(CREATE_QUERY);
Log.d("database Operations","Table created");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void putInformation(DatabaseOperations dop, String name,String password,String email)
{
SQLiteDatabase SQ = dop.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(TableData.TableInfo.USER_EMAIL, email);
cv.put(TableData.TableInfo.USER_NAME,name);
cv.put(TableData.TableInfo.USER_PASSWORD, password);
//cv.put(TableData.TableInfo.USER_CON,con_password);
SQ.insert(TableData.TableInfo.TABLE_NAME, null, cv);
Log.d("database Operations","One raw inserted");
}
}
答案 0 :(得分:0)
您的onUpgrade()(版本号增加后)方法为空,因此如果您的表未在onCreate()期间创建(首次创建数据库),则永远不会创建它,并且将抛出相同的错误。 正如你所说,你创造了空间,然后增加版本,然后尝试永远不会锻炼。
尝试卸载应用并重新使用现有代码。
答案 1 :(得分:0)
您是否正在从数据库的版本1更新到版本2?如果是,那么您需要为新表运行create语句" reg_info"在onUpgrade。当数据库更新到更新版本(因此您的版本2)时,将调用此方法。 OnCreate仅在数据库尚未存在时调用,或者您明确调用它。
onUpgrade背后的目的是允许开发人员更新数据库方案,同时保留已存在的数据。所以你的onUpgrade可能看起来像:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(CREATE_QUERY);
}
如果要强制数据库重新创建自己并调用onCreate,则擦除应用程序设置并再次打开应用程序,它应该擦除数据库并重新创建它。
答案 2 :(得分:0)
在更新数据库版本时,您需要覆盖onUpgrade方法,如下所示:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("DROP TABLE IF EXISTS contacts");
onCreate(db);
}
然后重新安装应用