Android.database.sqlite.SQLiteException: нет такого столбца: имя (код 1)

Я работал над этим проектом, в котором данные будут сохраняться в SQLite, если приложение отключено. Но я получаю эту ошибку, когда я создаю и запускаю. Я тоже проверил с помощью SQL-запроса. Но не удалось понять, в чем именно проблема.

MainActivity.java

public class MainActivity extends AppCompatActivity {


    RecyclerView recyclerView;
    EditText name;
    RecyclerView.LayoutManager layoutManager;
    RecyclerAdapter recyclerAdapter;
    ArrayList<Contact> arrayList=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView=findViewById(R.id.recyclerView);
        name=findViewById(R.id.name);
        layoutManager=new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setHasFixedSize(true);
        recyclerAdapter=new RecyclerAdapter(arrayList);
        recyclerView.setAdapter(recyclerAdapter);
        readfromlite();
    }
private void readfromlite()
    {
        arrayList.clear();
        DbHelper dbHelper=new DbHelper(this);
        SQLiteDatabase database=dbHelper.getReadableDatabase();
        Cursor cursor=dbHelper.readlite(database);
         while (cursor.moveToNext())
         {

             String name=cursor.getString(cursor.getColumnIndex(DbContract.NAME));
             int sync_status= cursor.getInt(cursor.getColumnIndex(DbContract.sync_status));
             arrayList.add(new Contact(name,sync_status));
         }

        recyclerAdapter.notifyDataSetChanged();
         cursor.close();
         dbHelper.close();
}

DBHelper.java

public class DbHelper extends SQLiteOpenHelper {
    private static final int dbversion=1;
    private static final String ctable= " create TABLE if not EXISTS " + DbContract.tname + " (id integer primary key autoincrement, " + DbContract.NAME + " text , " + DbContract.sync_status + " integer ) ; " ;
    private static final String dtable= " drop table if EXISTS " + DbContract.tname ;

    public DbHelper(Context context){
    super(context,DbContract.dbname,null,dbversion);


    }
    @Override
    public void onCreate(SQLiteDatabase db) {
    db.execSQL(ctable);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    db.execSQL(dtable);
    onCreate(db);

    }
    public void savelite(String name,int sync_status,SQLiteDatabase database){
        ContentValues contentValues=new ContentValues();
        contentValues.put(DbContract.NAME,name);
        contentValues.put(DbContract.sync_status,sync_status);
        database.insert(DbContract.tname,null,contentValues);
    }

    public Cursor readlite(SQLiteDatabase database){

        String[] resultset = {DbContract.NAME,DbContract.sync_status};
    return (database.query(DbContract.tname,resultset,null,null,null,null,null));
    }

    public void updatelite(String name,int sync_status,SQLiteDatabase database){

        ContentValues contentValues=new ContentValues();
        contentValues.put(DbContract.sync_status,sync_status);
        String selection=DbContract.NAME+"LIKE?";
        String[] selection_args = {name};
        database.update(DbContract.tname,contentValues,selection,selection_args);

    }
}

DbContract.java

public class DbContract {

    public static final int SYNC_STATUS_OK=0;
    public static final int SYNC_STATUS_FAILED=1;
    public static final String dbname = "contactdb";
    public static final String tname = "contactinfo";
    public static final String NAME = "name";
    public static final String sync_status = "syncstatus";

}

Логкэт

2019-03-10 19:22:31.438 2946-2946/com.app.datamanager E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.app.datamanager, PID: 2946
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.app.datamanager/com.app.datamanager.MainActivity}: android.database.sqlite.SQLiteException: no such column: name (code 1): , while compiling: SELECT name, syncstatus FROM contactinfo
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2947)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3012)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1716)
        at android.os.Handler.dispatchMessage(Handler.java:110)
        at android.os.Looper.loop(Looper.java:232)
        at android.app.ActivityThread.main(ActivityThread.java:6802)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1103)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)
     Caused by: android.database.sqlite.SQLiteException: no such column: name (code 1): , while compiling: SELECT name, syncstatus FROM contactinfo
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:965)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:576)
        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:1353)
        at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1200)
        at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1071)
        at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1239)
        at com.app.datamanager.DbHelper.readlite(DbHelper.java:41)
        at com.app.datamanager.MainActivity.readfromlite(MainActivity.java:52)
        at com.app.datamanager.MainActivity.onCreate(MainActivity.java:36)
        at android.app.Activity.performCreate(Activity.java:6974)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2900)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3012) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1716) 
        at android.os.Handler.dispatchMessage(Handler.java:110) 
        at android.os.Looper.loop(Looper.java:232) 
        at android.app.ActivityThread.main(ActivityThread.java:6802)
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
2 191
3

Ответы 3

Эта строка создает синтаксически неверный оператор sql:

String selection=DbContract.NAME+"LIKE?";

Если вы передадите значение, например «Боб», в качестве параметра, результат будет таким:
nameLIKEBob (вместо name LIKE 'Bob'), а nameLIKEBob будет считаться именем столбца.

Вам нужно вставить пробелы следующим образом:

String selection=DbContract.NAME+" LIKE ?";

Спасибо за это, хотя это не решило проблему. Приложение все еще вылетает. Но я изменил версию базы данных с 1 на 201, когда прочитал ее в каком-то решении, и теперь она работает как часы. Но я не понимаю как? Не могли бы вы просто проинформировать меня о том, какое отношение эта версия базы данных имеет к решению?

Abhishek P 10.03.2019 15:21

Ничего. Вы только что воссоздали базу данных. Возможно, вы изменили имена столбцов в коде, и это изменение никогда не делалось в БД. Все, что вам нужно было сделать, это удалить приложение и запустить его снова.

forpas 10.03.2019 15:23

@Abhishek Изменилась ли эта версия и переустановка приложения, чтобы решить вашу проблему, или она все еще остается?

MD Naseem Ashraf 10.03.2019 15:27

Собственно, ошибка возникла при моей первой сборке. Я ничего не менял в коде. Первая сборка, когда версия была 1, приложение вылетало.

Abhishek P 10.03.2019 15:27

Насим, да, теперь это работает после изменения номера версии.

Abhishek P 10.03.2019 15:28

Changed the database version from 1 to 201.

Теперь это работает. На самом деле я не знаю, какое отношение номер версии имеет к решению. Надеюсь, кто-нибудь даст объяснение. Ваше здоровье.

Изменение номера версии вызывает onUpgrade(), и, как вы видите внутри этого метода, таблица удаляется и создается заново. Вы могли бы сделать это, просто удалив приложение, поскольку у вас есть только 1 таблица. Больше ничего.

forpas 10.03.2019 15:32

Я попробовал это, сохранив номер версии как 1, удалил и переустановил. Но он терпит крах. Так что только я запутался. Я знаю, как работает onupgrade, но тут я запутался.

Abhishek P 10.03.2019 15:37

У меня была такая же проблема, но это было с удалением столбца из таблицы, поэтому, когда я изменил его

db.delete(cons.tableNames[3], Cart.KEY_f+"=$valueToChange", null)

за это

db.delete(cons.tableNames[3], Cart.KEY_f + "  LIKE  '%" + valueToChange + "%' ", null)

И я делаю обновление так

fun updateCart(id: Int, mBusiness: Business) {
    val db = dbHelper.writableDatabase
    // New value for one column
    val valueToChange = mBusiness.e
    val values = ContentValues().apply {
        put(Business.KEY_e, valueToChange)
    }

    db.update(cons.tableNames[p.mReturnIntSP(meuContexto, cons.tablePosition)], values, "id=$id", null)
    db.close() // Closing database connection
}

Другие вопросы по теме