Основной выпуск
Вы не создаете экземпляр объекта helper , поэтому он становится пустым при попытке db=helper.getReadableDatabase();
в методе initialize
.
Таким образом, вам нужно создать экземпляр объекта-помощника до db=helper.getReadableDatabase();
.
Однако вы не сможете создать экземпляр helper , так как он был определен с типом SQLiteOpenHelper, согласно SQLiteOpenHelper helper;. It should be a type of a subclass of SQLiteOpenHelper, as such you should instead use something like,
mySqliteOpenHelperSubclass = myDBHelper`.
Затем в методе initialize
создайте экземпляр объекта myDBhelper
, создав его. например myDBHelper = new mySqliteOpenHelperSubclass(this);
и тогда вы можете использовать myDBHelper.getWritableDatabase();
В настоящее время ваш код приведет к исключению нулевого указателя.
Дополнительный выпуск
id=c.getInt(c.getColumnIndex(query));
приведет к исключению (если в таблице есть какие-либо строки), поскольку c.getColumnIndex()
будет сказано найти индекс столбца для столбца с именем SELECT ID FROM your_table_name WHERE ID = (ID) , которого бы не было.
Результатом будет -1, что является недопустимым индексом, а исключение будет указывать на недопустимое смещение -1.
например.
09-07 21:16:24.903 1546-1546/? E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{so52226238.so52226238/so52226238.so52226238.Splash}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
Рабочий пример
1 Database.java
Предполагается, что Database.java (при условии, что это подкласс SQLiteOpenHelper): -
public class Database extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "mydb";
public static final int DATABASE_VERSION = 1;
public static final String TABLE_NAME = "mytable";
public static final String COLUMN_ID = "ID";
public static final String COLUMN_NAME = "name";
public Database(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String crtsql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY," +
COLUMN_NAME + " TEXT" +
")";
sqLiteDatabase.execSQL(crtsql);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
public long insert(String name) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(COLUMN_NAME,name);
return db.insert(TABLE_NAME,null,cv);
}
}
- Очевидно, что ваша версия может быть более сложной
2 Splash.java
Следующее исправит проблемы (см. Комментарии): -
public class Splash extends AppCompatActivity {
SQLiteDatabase db;
// SQLiteOpenHelper helper; <<<<<<<<<< DELETED
Database database;
int id=0;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
initialize();
}
public void initialize(){
database = new Database(this); //<<<<< instantiate Database helper
db=database.getReadableDatabase();
database.insert("Fred"); //<<<<<<<<<< Added to test with data.
String query = "SELECT ID FROM " + TABLE_NAME
+ " WHERE ID = (ID)";
Cursor c = db.rawQuery(query, null);
if (c.moveToFirst()) {
id=c.getInt(c.getColumnIndex(COLUMN_ID)); //<<<<<<<<<< ID column
//id=c.getInt(c.getColumnIndex("ID")); //<<<<<<<<<< as above but uses hard coded column name
}else{}
c.close(); //<<<<<<<<<< YOU SHOULD ALWAYS CLOSE A CURSOR WHEN FINISHED WITH IT
if (id<0){
Log.d("IDINFO","ID not found."); //<<<<<<<<<< used for simplicity
/*
Intent homeIntent = new Intent(Splash.this, Onboard.class);
startActivity(homeIntent);
finish();
*/
}else{
Log.d("IDINFO","ID found."); //<<<<<<<<<< used for simplicity
/*
Intent homeIntent = new Intent(Splash.this, mainmenu.class);
startActivity(homeIntent);
finish();
*/
}
}
}
- Примечание Попытка начать действия была закомментирована для простоты и для демонстрации.