Мой заставка продолжает падать и принудительно закрывать приложение - PullRequest
0 голосов
/ 07 сентября 2018

Мое приложение продолжает зависать при запуске. Пожалуйста, проверьте мой код. Я делал автоматический вход на мой экран-заставку. Пожалуйста, помогите мне, это для моей диссертации.

splash.class

import android.content.Intent;
import android.database.Cursor;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import static com.example.mgimoro.dietgo.Database.TABLE_NAME;

public class Splash extends AppCompatActivity {
SQLiteDatabase db;
SQLiteOpenHelper helper;
Database database;
int id=0;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    initialize();
}
public void initialize(){
    db=helper.getReadableDatabase();
    String query = "SELECT ID FROM " + TABLE_NAME
            + " WHERE ID = (ID)";
    Cursor c = db.rawQuery(query, null);
    if (c.moveToFirst()) {
        id=c.getInt(c.getColumnIndex(query));
    }else{}
    if (id<0){
        Intent homeIntent = new Intent(Splash.this, Onboard.class);
        startActivity(homeIntent);
        finish();
    }else{
        Intent homeIntent = new Intent(Splash.this, mainmenu.class);
        startActivity(homeIntent);
        finish();
      }
   }
  }

1 Ответ

0 голосов
/ 07 сентября 2018

Основной выпуск

Вы не создаете экземпляр объекта 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();
            */
        }
    }
}
  • Примечание Попытка начать действия была закомментирована для простоты и для демонстрации.
...