Мой заставка продолжает падать и принудительно закрывать приложение

-4

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

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();
      }
   }
  }
  • 3
    Привет, добро пожаловать в ТАК. Пожалуйста, прочитайте stackoverflow.com/help/how-to-ask и отредактируйте свой вопрос соответственно. Пожалуйста, поделитесь стековой трассировкой, которая вызывает сбой вашего приложения.
  • 2
    чтобы помочь нам нужно увидеть ошибку logcat
Показать ещё 3 комментария
Теги:
android-sqlite
splash-screen

1 ответ

1

Главная проблема

Вы не создаете экземпляр вспомогательного объекта, поэтому он имеет значение null, когда вы db=helper.getReadableDatabase(); в методе initialize.

Таким образом, вам нужно создать экземпляр вспомогательного объекта до db=helper.getReadableDatabase(); ,

Тем не менее, вы не сможете создать экземпляр помощника, как он был определен с помощью типа SQLiteOpenHelper, в соответствии SQLiteOpenHelper helper;. It should be a type of a subclass of SQLiteOpenHelper, as such you should instead use something like, 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, построив его. например 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();
            */
        }
    }
}
  • Примечание. Попытка начать работу была прокомментирована для удобства и демонстрации.
  • 1
    Я всегда восхищаюсь вашими попытками ответить, вы часто (если не всегда) отвечаете с точным и подробным описанием. Великолепно работает!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню