In short, the application connects to the database (SQLite) and reads information from it.
The problem is that everything works as it should on the emulator, the application is fully functional. But when you run the application on the device, it crashes.
Why does everything work as it should on the emulator, but does a crash occur on the device?
The application crashes on these lines of code:
either here:
mDatabaseHelper = new DataBaseHelper(this, "mydatabase.db", null, 1); mSqLiteDatabase = mDatabaseHelper.getWritableDatabase();or, if instead of those lines use
mSqLiteDatabase = this.openOrCreateDatabase("mydatabase.db", MODE_PRIVATE, null), here:Cursor cursor = mSqLiteDatabase.query(DataBaseHelper.DATABASE_TABLE, new String[]{ DataBaseHelper.NAME, DataBaseHelper.NUMBER}, null,null,null,null,null);
Identified by experience.
StackTrace with the second option (the creation of the cursor takes place on the 30th line in StartActivity ):
Process: ru.startandroid.begin, PID: 12643 java.lang.RuntimeException: Unable to start activity ComponentInfo{ru.startandroid.begin/ru.startandroid.begin.StartActivity}: android.database.sqlite.SQLiteException: no such table: database1 (code 1): , while compiling: SELECT name, number FROM database1 ################################################################# Error Code : 1 (SQLITE_ERROR) Caused By : SQL(query) error or missing database. (no such table: database1 (code 1): , while compiling: SELECT name, number FROM database1) ################################################################# at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3184) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3294) at android.app.ActivityThread.access$1000(ActivityThread.java:210) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1704) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:6938) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) Caused by: android.database.sqlite.SQLiteException: no such table: database1 (code 1): , while compiling: SELECT name, number FROM database1 ################################################################# Error Code : 1 (SQLITE_ERROR) Caused By : SQL(query) error or missing database. (no such table: database1 (code 1): , while compiling: SELECT name, number FROM database1) ################################################################# at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1093) at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:670) at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59) 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:1454) at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1301) at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1172) at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1340) at ru.startandroid.begin.StartActivity.onCreate(StartActivity.java:30) at android.app.Activity.performCreate(Activity.java:6575) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1134) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3137) ... 10 more Complete database creation
package ru.startandroid.begin; import android.content.Context; import android.database.DatabaseErrorHandler; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DataBaseHelper extends SQLiteOpenHelper { // имя базы данных private static final String DATABASE_NAME = "mydatabase.db"; // версия базы данных private static final int DATABASE_VERSION = 1; //имя таблицы public static final String DATABASE_TABLE = "database1"; // название столбцов public static final String NAME = "name"; public static final String NUMBER = "number"; //скрипт создания private static final String SCRIPT = "CREATE TABLE IF NOT EXISTS " + DATABASE_TABLE + " (" + " integer primary key autoincrement, " + NAME + " text no null, " + NUMBER + " long, " + " (Field1 VARCHAR, Field2 VARCHAR;)"; DataBaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } ////конструктор БД public DataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } public DataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) { super(context, name, factory, version, errorHandler); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(SCRIPT); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // Удаляем старую таблицу и создаём новую db.execSQL("DROP TABLE IF IT EXISTS " + DATABASE_TABLE); // Создаём новую таблицу onCreate(db); } } and full Cursor code
package ru.startandroid.begin; import android.app.ListFragment; import android.app.ListActivity; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.util.StringBuilderPrinter; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; public class StartActivity extends ListActivity { private ArrayAdapter<String> mAdapter; private DataBaseHelper mDatabaseHelper; private SQLiteDatabase mSqLiteDatabase; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //подключаемся к БД!!!!! //mDatabaseHelper = new DataBaseHelper(this, "mydatabase.db", null, 1); //mSqLiteDatabase = mDatabaseHelper.getWritableDatabase(); mSqLiteDatabase = this.openOrCreateDatabase("mydatabase.db", MODE_PRIVATE, null); ///////////////////////////////////// List Cursor cursor = mSqLiteDatabase.query(DataBaseHelper.DATABASE_TABLE, new String[] { DataBaseHelper.NAME, DataBaseHelper.NUMBER}, null,null,null,null,null); //cursor.moveToFirst(); } }