I can not understand why the table is not created in the Database, I think I am doing everything correctly, but I get the error SQLiteException: no such table.

 public boolean onOptionsItemSelected(MenuItem item) { DBH dbh = new DBH(this); SQLiteDatabase db = dbh.getWritableDatabase(); ContentValues cv = new ContentValues(); String commentsDoc = etDocumentComment.getText().toString(); dateExec=dateExsecution.getText().toString(); String docStatus =""; cv.put(DBH.ClaimWorkInfo.DC.OUTLET, outletName); cv.put(DBH.ClaimWorkInfo.DC.DOC_TYPE, documentTypeName); cv.put(DBH.ClaimWorkInfo.DC.DATE_EXEC, dateExec); cv.put(DBH.ClaimWorkInfo.DC.MARK, documentMarkName); cv.put(DBH.ClaimWorkInfo.DC.STATUS, docStatus); cv.put(DBH.ClaimWorkInfo.DC.COMMENTS, commentsDoc); long rowID = db.insert(DBH.ClaimWorkInfo.TABLE_NAME, null, cv); //приложение падает в этой строчке Cursor c = db.query(DBH.ClaimWorkInfo.TABLE_NAME, null, null, null, null, null, null); if (c.moveToFirst()) { int idColIndex = c.getColumnIndex(DBH.ClaimWorkInfo.DC.CLAIM_WORK_ID); int nameColIndexO = c.getColumnIndex(DBH.ClaimWorkInfo.DC.OUTLET); int nameColIndexD = c.getColumnIndex(DBH.ClaimWorkInfo.DC.DOC_TYPE); int nameColIndexDE = c.getColumnIndex(DBH.ClaimWorkInfo.DC.DATE_EXEC); int nameColIndexM = c.getColumnIndex(DBH.ClaimWorkInfo.DC.MARK); int nameColIndexS = c.getColumnIndex(DBH.ClaimWorkInfo.DC.STATUS); int nameColIndex = c.getColumnIndex(DBH.ClaimWorkInfo.DC.COMMENTS); do { Log.d("DAtabase", "ID = " + c.getInt(idColIndex) + ", outlet = " + c.getString(nameColIndexO)+ ", doc_type = " + c.getString(nameColIndexD)+ ", date_exec = " + c.getString(nameColIndexDE)+ ", doc_mark = " + c.getString(nameColIndexM)+ ", doc_status = " + c.getString(nameColIndexS)+ ", comment = " + c.getString(nameColIndex) ); } while (c.moveToNext()); } else Log.d("Nothing in DB", "0 rows"); c.close(); return true; } 

DBHelper class code:

 public class DBH extends SQLiteOpenHelper implements BaseColumns { private static DBH instance = null; public final static int VERSION = 13; private String mDbName; public DBH(Context context) { super(context, context.getString(R.string.db_name), null, VERSION); this.mDbName = context.getString(R.string.db_name); } public static DBH getInstance(Context context) { if (instance == null) { instance = new DBH(context); } return instance; } @Override public void onCreate(SQLiteDatabase db) { if (!checkDataBase()) { createTables(db); } } public final static class ClaimWorkInfo { public final static String TABLE_NAME = "claim_work"; public final static class DC { public final static String CLAIM_WORK_ID = "claim_work_id"; public final static String OUTLET = "outlet"; public final static String DOC_TYPE = "doc_type"; public final static String DATE_EXEC = "text"; public final static String MARK = "mark"; public final static String STATUS = "status"; public final static String COMMENTS = "comments"; } public final static class DT { public final static String CLAIM_WORK_ID = "integer primary key autoincrement"; public final static String OUTLET = "text"; public final static String DOC_TYPE = "text"; public final static String DATE_EXEC = "text"; public final static String MARK = "text"; public final static String COMMENTS = "text"; public final static String Status = "text"; } } private boolean isTableExists(SQLiteDatabase db, String tableName) { if (tableName == null || db == null || !db.isOpen()) { return false; } Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='" + tableName + "'", null); if (cursor != null) { if (cursor.moveToFirst()) { int count = cursor.getInt(0); cursor.close(); return count > 0; } else { cursor.close(); return false; } } else { return false; } } private void createTable(SQLiteDatabase db, String tableName, Field[] flds, Field[] tps, String foreign) { if (!isTableExists(db, tableName)) { AppLog.e("Create table: " + "!isTableExists" + tableName); String sql = "create table " + tableName + " ("; for (int i = 0; i < flds.length; i++) { try { sql = sql + flds[i].get(DBH.class).toString() + " " + tps[i].get(DBH.class).toString(); if (i != flds.length - 1) { sql = sql + ", "; } } catch (Exception e) { AppLog.e("Create table error: " + e.getMessage()); } } sql = sql + (foreign == null ? ")" : (", " + foreign + ")")); AppLog.i("Query table creation: " + sql); try { db.execSQL(sql); } catch (Exception e) { AppLog.e("Create table error: " + e.getMessage()); } } } private void createTables(SQLiteDatabase db) { createTable(db, DBH.ClaimWorkInfo.TABLE_NAME, DBH.ClaimWorkInfo.DC.class.getFields(), DBH.ClaimWorkInfo.DT.class.getFields(), null); } private boolean checkDataBase() { SQLiteDatabase checkDB = null; try { checkDB = SQLiteDatabase.openDatabase(mDbName, null, SQLiteDatabase.OPEN_READONLY); } catch (SQLiteException e) { } if (checkDB != null) { checkDB.close(); } return (checkDB != null); } } 
  • localize the exception after no such table a lot of things are written, and at least the line from where the same logical one is thrown ... For now everything is clear, you do not have a table for which there is a request of a certain type - Shwarz Andrei

1 answer 1

I found a problem, the database was already created in this application, therefore when creating a DBHelper (DBH) class object, the onCreate () method, in which tables should be created, did not work. I removed the application and installed it again, it all worked.

  • 3
    To make changes to the database structure, use the onUpgrade() method of the onUpgrade() class. For the method to be invoked, the database version must be increased. This is mainly relevant when the application is already being used by users. At the stage of creating / debugging, it is certainly easier to reinstall the application. - pavlofff