Как исправить ошибку getWritableDatabase () в андроид студии? - PullRequest
0 голосов
/ 06 ноября 2019

Я использую SQLite в первый раз. Я следую некоторому учебнику YouTube для этого. Но я сталкиваюсь с ошибкой getWritableDatabase().

SQLiteDatabase sqLiteDatabase = databaseHelper.getWritableDatabase();

, если я добавлю эту строку в Mainactivity.java, мое приложение остановится. Если я удаляю эту строку, приложение запускается, но база данных не создается.

Как я могу решить эту проблему? Заранее спасибо.

Это мой класс базы данных:

public class DatabaseHelper extends SQLiteOpenHelper {


    private static final String DATABASE_NAME = "attendanceproject.db";
    private static final String TABLE_NAME = "TeacherInfo";
    private static final String ID = "_id";
    private static final String NAME ="name";
    private static final String EMAIL = "email";
    private static final String PASSWORD = "password";
    private static final String PHONE = "phone";
    private static final int VERSION_NAME = 3;
    private static final String CREATE_TABLE = "CREATE TABLE "+TABLE_NAME+"("+ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+NAME+" VARCHAR(100) NOT NULL,"+EMAIL+" TEXT NOT NULL, "+PASSWORD+" TEXT NOT NULL, "+PHONE+" VARCHAR(11) NOT NULL);";
    private static final String DROP_TABLE = "DROP TABLE IF EXISTS "+TABLE_NAME;
    private Context context;

    public DatabaseHelper(@Nullable Context context) {
        super(context, DATABASE_NAME, null, VERSION_NAME);

    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        try {

            sqLiteDatabase.execSQL(CREATE_TABLE);
            Toast.makeText(context, "Oncreate is Called", Toast.LENGTH_SHORT).show();

        } catch (Exception e) {

            Toast.makeText(context, "Exception" + e, Toast.LENGTH_SHORT).show();

        }

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {

    }
}

ошибка: введите описание изображения здесь

Ответы [ 4 ]

1 голос
/ 06 ноября 2019

Инициализируйте ваш context в DatabaseHelper. как следующее.

private Context context;

public DatabaseHelper(@Nullable Context context) {
   super(context, DATABASE_NAME, null, VERSION_NAME);
   this.context = context; // add this line to initialize your context.

}
0 голосов
/ 06 ноября 2019

Пожалуйста, попробуйте этот способ.

Создайте на отдельном Java-классе для DatabaseHandler

package example.yourpackage;  

import android.content.ContentValues;  
import android.content.Context;  
import android.database.Cursor;  
import android.database.sqlite.SQLiteDatabase;  
import android.database.sqlite.SQLiteOpenHelper; 

public class DatabaseHandler extends SQLiteOpenHelper {  
    private static final int DATABASE_VERSION = 1;  
    private static final String DATABASE_NAME = "dbName";  
    private static final String TABLE_CONTACTS = "tableName";  
    private static final String KEY_ID = "id";  
    private static final String KEY_NAME = "name";  
    private static final String KEY_PH_NO = "phone_number"

    public DatabaseHandler(Context context) {  
        super(context, DATABASE_NAME, null, DATABASE_VERSION);  
        //3rd argument to be passed is CursorFactory instance  
    }  

   @Override  
    public void onCreate(SQLiteDatabase db) {  
        String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("  
                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"  
                + KEY_PH_NO + " TEXT" + ")";  
        db.execSQL(CREATE_CONTACTS_TABLE);  
    }  

   // Upgrading database  
    @Override  
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
        // Drop older table if existed  
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);  

        // Create tables again  
        onCreate(db);  
    }  

    // code to add the new contact  
    void addContact(Contact contact) {  
        SQLiteDatabase db = this.getWritableDatabase();  

        ContentValues values = new ContentValues();  
        values.put(KEY_NAME, contact.getName()); // Contact Name  
        values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone  

        // Inserting Row  
        db.insert(TABLE_CONTACTS, null, values);  
        //2nd argument is String containing nullColumnHack  
        db.close(); // Closing database connection  
    } 
}

В своей основной деятельности MainActivity

@Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        DatabaseHandler db = new DatabaseHandler(this);  
}

Теперь вы можете проверить, что база данных создана.

Для просмотра данных, хранящихся в sqlite в Android Studio.

Чтобы просмотреть базу данных и ее данные, хранящиеся в Android SQLite, выполните следующие действия:

  1. Откройте проводник.
  2. Перейдите в каталог данных внутри каталога данных.
  3. Найдите имя пакета приложения.
  4. Внутри пакета приложения перейдите в базы данных, где вынайдет вашу базу данных (contactsManager).
  5. Сохраните базу данных (contactsManager) где угодно.
  6. Загрузите любые плагины или инструмент для браузера SqLite (в моем случае DB Browser для SQLite).
  7. Запустите DB Browser для SQLite и откройте свою базу данных (contactsManager).
  8. Перейдите в Просмотр данных -> выберите свою таблицу (контакты), и вы увидите сохраненные данные.

Надеюсь, это поможет вам.

0 голосов
/ 06 ноября 2019

Вы пытаетесь показать Toast с Context, который не инициализирован. Первый раз в блоке try, и он выбрасывает, затем в другой раз в блоке catch и это исключение приводит к сбою приложения.

Рассмотрите возможность полного удаления try-catch. Если при создании базы данных возникла проблема, onCreate() должно выдать исключение.

0 голосов
/ 06 ноября 2019

Исходя из ошибки, похоже, что ваш контекст нулевой.

public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.context = context;
}

Если вы хотите, чтобы информация о протоколировании использовалась как-то вроде logcat, не используйте Toast.

Также,

Я бы использовал ORM, например Room,

https://developer.android.com/training/data-storage/room

Приведенная выше статья имеет довольно хорошее объяснение.

Ниже приведены хорошие примеры.

https://github.com/android/architecture-components-samples/tree/master/BasicRxJavaSample/app/src/main/java/com/example/android/observability/persistence

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...