Не могу вставить значения в таблицу на Android App (SQLite) - PullRequest
0 голосов
/ 26 апреля 2020

Я сталкиваюсь с очень странной проблемой, и я действительно не понимаю, что ее вызывает. Поэтому я пытаюсь вставить значения в таблицу. Позвольте мне сначала сказать, что таблица существует (я проверил ее в Db Browser для 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);
    }

поэтому в другой деятельности я вызываю insertInDB (insertCompany ()); и я получаю это:

 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".

Буду очень признателен, если кто-нибудь найдет что-то в коде.

1 Ответ

0 голосов
/ 26 апреля 2020

В допустимом операторе вставки все строковые литералы должны быть заключены в одинарные кавычки. Таким образом, ваше утверждение с жестко закодированными значениями должно быть:

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

Если вы не используете одинарные кавычки, тогда rigas и sem обрабатываются как имена столбцов, и, поскольку они не являются, вы получаете ошибку ,

Но правильный, безопасный и рекомендуемый способ вставки новых строк в таблицу - это метод 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, то вставка не удалась. Все остальное будет идентификатором новой строки (столбец company) и означает, что оно выполнено успешно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...