无法在 Android 应用程序 (SQLite) 上的 table 中插入值
Cant insert Values in table on Android App(SQLite)
我遇到了一个非常奇怪的问题,我真的看不出是什么原因造成的。
所以我试图在 table 中插入值。
首先让我告诉你 table 存在(我已经检查过它的 Db Browser for SQLite)。
这个问题让我对插入查询进行了硬编码,但没有任何改变。为了节省 space,我将只粘贴必要的代码块。因此,让我向您展示代码块。
在我的数据库助手中 class
public class DBHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 3;
public static final String DATABASE_NAME = "SemsWMS.db";
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(createCompany);
db.execSQL(createFinDoc);
db.execSQL(createMtrLines);
db.execSQL(createTrdr);
db.execSQL(createTrdBranch);
db.execSQL(createMtrl);
db.execSQL(createMtrLot);
db.execSQL(createMtrSubstitute);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists company");
db.execSQL("drop table if exists findoc");
db.execSQL("drop table if exists mtrlines");
db.execSQL("drop table if exists trdr");
db.execSQL("drop table if exists trdbranch");
db.execSQL("drop table if exists mtrl");
db.execSQL("drop table if exists mtrlot");
db.execSQL("drop table if exists mtrsubstitute");
db.execSQL(createCompany);
db.execSQL(createFinDoc);
db.execSQL(createMtrLines);
db.execSQL(createTrdr);
db.execSQL(createTrdBranch);
db.execSQL(createMtrl);
db.execSQL(createMtrLot);
db.execSQL(createMtrSubstitute);
}
public static class Company implements BaseColumns{
public static final String tablename = "company";
public static final String company = "company";
public static final String site = "site";
public static final String webuser = "webuser";
public static final String password = "password";
public static final String appid = "appid";
public static final String webuserid = "webuserid";
public static final String upddatetrdr = "upddatetrdr";
public static final String upddatetrdbranch = "upddatetrdbranch";
public static final String upddatemtrl = "upddatemtrl";
public static final String upddatemtrlot = "upddatemtrlot";
public static final String upddatemtrsubstitute = "upddatemtrsubstitute";
}
public static final String createCompany = "create table " + Company.tablename + "("+Company.company+" integer primary key, "
+Company.site+" text, "
+Company.webuser+" text, "
+Company.password+" text, "
+Company.appid +" integer, "
+Company.webuserid+" integer, "
+Company.upddatetrdr+" numeric, "
+Company.upddatetrdbranch+" numeric, "
+Company.upddatemtrl+" numeric, "
+Company.upddatemtrlot+" numeric, "
+Company.upddatemtrsubstitute+" numeric)";
DBHelper 中的硬编码块class
public static String insertCompany(){
String sql = "insert into company(company,site,appid,webuser,password) values(2,rigas,9999,sems,1234)";
return sql;
}
DBHelper 中的方法class 以便在其他活动中执行查询
public void insertInDB(String query){
SQLiteDatabase db = getWritableDatabase();
db.execSQL(query);
}
所以在其他 activity 我打电话
insertInDB(插入公司());
我明白了:
android.database.sqlite.SQLiteException: no such column: rigas (code 1): , while compiling: insert into company(company,site,appid,webuser,password) values(2,rigas,9999,sems,1234)
#################################################################
Error Code : 1 (SQLITE_ERROR)
Caused By : SQL(query) error or missing database.
(no such column: rigas (code 1): , while compiling: insert into company(company,site,appid,webuser,password) values(2,rigas,9999,sems,1234))
#################################################################
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1073)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:638)
它说列 "rigas"...但在我的插入查询中没有这样的列。 .."rigas" 是列 "site" 的值。
如果有人能在代码中找到一些东西,我将不胜感激。
在有效的插入语句中,所有字符串文字都必须用单引号引起来。
因此,您的带有硬编码值的语句应该是:
insert into company(company,site,appid,webuser,password) values(2,'rigas',9999,'sems',1234)
如果您不使用单引号,那么 rigas
和 sem
将被视为列名,因为它们不是您得到的错误。
但是在 table 中插入新行的正确、安全和推荐的方法是使用 insert()
方法,使用 ContentValues
,如下所示:
public int insertInDB(String site, int appid, String webuser, String password) {
SQLiteDatabase db = getWritableDatabase();
ContentValues c = new ContentValues();
c.put(Company.site, site);
c.put(Company.appid, appid);
c.put(Company.webuserid, webuser);
c.put(Company.password, password);
int result = db.insert(Company.tablename, null, c);
db.close();
return result;
}
所以你传递给insertInDB()
4列值(不需要传递company
因为你定义它为integer primary key
然后它是AUTOINCREMENT)。
您可以检查 insertInDB()
的返回值:如果它是 -1
则插入失败。其他任何内容都将成为新行的 ID(company
列),这意味着它已成功。
我遇到了一个非常奇怪的问题,我真的看不出是什么原因造成的。 所以我试图在 table 中插入值。 首先让我告诉你 table 存在(我已经检查过它的 Db Browser for SQLite)。 这个问题让我对插入查询进行了硬编码,但没有任何改变。为了节省 space,我将只粘贴必要的代码块。因此,让我向您展示代码块。 在我的数据库助手中 class
public class DBHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 3;
public static final String DATABASE_NAME = "SemsWMS.db";
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(createCompany);
db.execSQL(createFinDoc);
db.execSQL(createMtrLines);
db.execSQL(createTrdr);
db.execSQL(createTrdBranch);
db.execSQL(createMtrl);
db.execSQL(createMtrLot);
db.execSQL(createMtrSubstitute);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists company");
db.execSQL("drop table if exists findoc");
db.execSQL("drop table if exists mtrlines");
db.execSQL("drop table if exists trdr");
db.execSQL("drop table if exists trdbranch");
db.execSQL("drop table if exists mtrl");
db.execSQL("drop table if exists mtrlot");
db.execSQL("drop table if exists mtrsubstitute");
db.execSQL(createCompany);
db.execSQL(createFinDoc);
db.execSQL(createMtrLines);
db.execSQL(createTrdr);
db.execSQL(createTrdBranch);
db.execSQL(createMtrl);
db.execSQL(createMtrLot);
db.execSQL(createMtrSubstitute);
}
public static class Company implements BaseColumns{
public static final String tablename = "company";
public static final String company = "company";
public static final String site = "site";
public static final String webuser = "webuser";
public static final String password = "password";
public static final String appid = "appid";
public static final String webuserid = "webuserid";
public static final String upddatetrdr = "upddatetrdr";
public static final String upddatetrdbranch = "upddatetrdbranch";
public static final String upddatemtrl = "upddatemtrl";
public static final String upddatemtrlot = "upddatemtrlot";
public static final String upddatemtrsubstitute = "upddatemtrsubstitute";
}
public static final String createCompany = "create table " + Company.tablename + "("+Company.company+" integer primary key, "
+Company.site+" text, "
+Company.webuser+" text, "
+Company.password+" text, "
+Company.appid +" integer, "
+Company.webuserid+" integer, "
+Company.upddatetrdr+" numeric, "
+Company.upddatetrdbranch+" numeric, "
+Company.upddatemtrl+" numeric, "
+Company.upddatemtrlot+" numeric, "
+Company.upddatemtrsubstitute+" numeric)";
DBHelper 中的硬编码块class
public static String insertCompany(){
String sql = "insert into company(company,site,appid,webuser,password) values(2,rigas,9999,sems,1234)";
return sql;
}
DBHelper 中的方法class 以便在其他活动中执行查询
public void insertInDB(String query){
SQLiteDatabase db = getWritableDatabase();
db.execSQL(query);
}
所以在其他 activity 我打电话 insertInDB(插入公司()); 我明白了:
android.database.sqlite.SQLiteException: no such column: rigas (code 1): , while compiling: insert into company(company,site,appid,webuser,password) values(2,rigas,9999,sems,1234)
#################################################################
Error Code : 1 (SQLITE_ERROR)
Caused By : SQL(query) error or missing database.
(no such column: rigas (code 1): , while compiling: insert into company(company,site,appid,webuser,password) values(2,rigas,9999,sems,1234))
#################################################################
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1073)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:638)
它说列 "rigas"...但在我的插入查询中没有这样的列。 .."rigas" 是列 "site" 的值。
如果有人能在代码中找到一些东西,我将不胜感激。
在有效的插入语句中,所有字符串文字都必须用单引号引起来。
因此,您的带有硬编码值的语句应该是:
insert into company(company,site,appid,webuser,password) values(2,'rigas',9999,'sems',1234)
如果您不使用单引号,那么 rigas
和 sem
将被视为列名,因为它们不是您得到的错误。
但是在 table 中插入新行的正确、安全和推荐的方法是使用 insert()
方法,使用 ContentValues
,如下所示:
public int insertInDB(String site, int appid, String webuser, String password) {
SQLiteDatabase db = getWritableDatabase();
ContentValues c = new ContentValues();
c.put(Company.site, site);
c.put(Company.appid, appid);
c.put(Company.webuserid, webuser);
c.put(Company.password, password);
int result = db.insert(Company.tablename, null, c);
db.close();
return result;
}
所以你传递给insertInDB()
4列值(不需要传递company
因为你定义它为integer primary key
然后它是AUTOINCREMENT)。
您可以检查 insertInDB()
的返回值:如果它是 -1
则插入失败。其他任何内容都将成为新行的 ID(company
列),这意味着它已成功。