如何修复Android Studio中的getWritableDatabase()错误?

我第一次使用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) {

    }
}

错误: enter image description here

b167521 回答:如何修复Android Studio中的getWritableDatabase()错误?

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.

}
,

您正在尝试显示Toast且未初始化的Context。第一次在try块中抛出该异常,另一次在catch块中抛出该异常,然后使应用程序崩溃。

考虑完全删除try-catch。如果创建数据库时出现问题,onCreate()应该引发异常。

,

请尝试这种方式。

DatabaseHandler

在单独的Java类上创建
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_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,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);  
}

现在,您可以检查是否已创建数据库。

  

要查看存储在android studio中sqlite中的数据。

请按照以下步骤查看数据库及其存储在android sqlite中的数据:

  1. 打开文件资源管理器。
  2. 转到数据目录内的数据目录。
  3. 搜索您的应用程序包名称。
  4. 在您的应用程序包中,转到要在其中找到数据库的数据库(contactsManager)。
  5. 将数据库(contactsManager)保存在任意位置。
  6. 下载任何SqLite浏览器插件或工具(在我的示例中为SQLite的DB Browser)。
  7. 启动用于SQLite的数据库浏览器并打开数据库(contactsManager)。
  8. 转到“浏览数据”->选择表(联系人),您将看到存储的数据。

希望这会对您有所帮助。

,

基于该错误,看起来您的上下文为空。

public DatabaseHelper(Context context) {
        super(context,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

本文链接:https://www.f2er.com/3153283.html

大家都在问