【问题标题】:Cant insert Values in table on Android App(SQLite)无法在 Android 应用程序(SQLite)的表中插入值
【发布时间】:2020-08-10 00:44:41
【问题描述】:

我面临一个非常奇怪的问题,我真的看不出是什么原因造成的。 所以我试图在表中插入值。 让我首先告诉你该表存在(我已经检查了它 Db Browser for SQLite)。 这个问题让我对插入查询进行了硬编码,但没有任何改变。为了节省空间,我将只粘贴必要的代码块。因此,让我向您展示代码块。 在我的数据库助手类中

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 类中的硬编码块

 public static  String insertCompany(){
        String sql = "insert into company(company,site,appid,webuser,password) values(2,rigas,9999,sems,1234)";



        return sql;
    } 

DBHelper 类中用于在其他活动中执行查询的方法

public void insertInDB(String query){

        SQLiteDatabase db = getWritableDatabase();
        db.execSQL(query);
    }

所以在我打电话的其他活动中 插入数据库(插入公司()); 我明白了:

 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”列的值。

如果有人能在代码中找到一些东西,我将非常感激。

【问题讨论】:

    标签: android sqlite android-sqlite sql-insert


    【解决方案1】:

    在有效的插入语句中,所有字符串文字都必须用单引号括起来。
    因此,您的带有硬编码值的语句应该是:

    insert into company(company,site,appid,webuser,password) values(2,'rigas',9999,'sems',1234)
    

    如果您不使用单引号,则 rigassem 将被视为列名,因为它们不是您会收到错误消息。

    但是在表中插入新行的正确、安全和推荐的方法是使用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 列),表示它成功了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 2015-06-23
      • 1970-01-01
      • 2013-06-18
      相关资源
      最近更新 更多