【问题标题】:Android how to insert data into database outside of the database helper classAndroid如何在数据库助手类之外将数据插入数据库
【发布时间】:2016-03-14 13:46:48
【问题描述】:

我已经建立了一个 SQLite 数据库,它在创建我需要的表方面运行良好。我现在一直在尝试做的是从另一个类(Signup.java)插入数据库。我想将文本输入抓取到edittext中并将其插入数据库,但仅在单击按钮时。

在下面查看我的 DatabaseHelper 类:

package com.example.testerrquin.euro2016fanguide;

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

public class DatabaseHelper extends SQLiteOpenHelper {

public static final String DATABASE_NAME = "Euro2016.db";
public static final String TABLE_USERS = "Users_table";
public static final String TABLE_CAPACITY = "Capacity_table";
public static final int CapacityOne = 1;

public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);
    SQLiteDatabase db = this.getWritableDatabase();
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("Create table " + TABLE_USERS +" (UserID INTEGER PRIMARY KEY AUTOINCREMENT, Forename TEXT, Surname TEXT, Email TEXT, Password TEXT, Country TEXT)");
    db.execSQL("Create table " + TABLE_CAPACITY +" (CapacityID INTEGER PRIMARY KEY AUTOINCREMENT, Capacity INTEGER)");

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_USERS);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_CAPACITY);
    onCreate(db);
}
}

基本上我需要运行以“db.execSQL”开头的行。我可能需要在某处引用“db”以链接到 Databasehelper 类,但不确定。目前我得到'无法解析符号'db'。

CompleteB.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {


            String grabFirstname = UsernameET.getText().toString();
            String grabSurname = SurnameET.getText().toString();
            String grabEmail = EmailET.getText().toString();
            String grabPassword = PasswordET.getText().toString();
            String grabCountry = CountryDrop.getSelectedItem().toString();

            db.execSQL("Insert into Users_table (Forename, Surname, Email, Password, Country) values ((" + grabFirstname +"),(" + grabSurname +"),(" + grabEmail +"), (" + grabPassword +"), (" + grabCountry +"))");

            Intent i=new Intent(Signup.this,Login.class);
            startActivity(i);
        }
    });

提前致谢。

【问题讨论】:

  • 您应该在您的助手类中执行此操作。添加一个方法,例如 addValues(String grabFirstName,String grabSurename....) 等,并将其与内容值一起使用以将其添加到表中。
  • 那么你不需要一直创建一个新的数据库对象。在您的情况下,您会收到此错误,因为您尚未定义 db
  • 你先用context初始化你db...

标签: java android sqlite insert


【解决方案1】:

在 SQL 帮助器类中声明您需要的任何方法:

public void sampleMethod(String[] arguments) {
    ContentValues values = new ContentValues();
    values.put("Column1", arguments[0]);
    values.put("Column2", arguments[1]);
    values.put("Column3", arguments[2]);
    ....
    db.insert(TABLE_NAME, null, values);
}

在您的活动中:

@Override
    public void onClick(View v) {

        String grabFirstname = UsernameET.getText().toString();
        String grabSurname = SurnameET.getText().toString();
        String grabEmail = EmailET.getText().toString();
        String grabPassword = PasswordET.getText().toString();
        String grabCountry = CountryDrop.getSelectedItem().toString();

        DatabaseHelper helper = new DatabaseHelper(context); //replace context with your activity context. "this" would refer to your onClickListener so be careful.

        helper.sampleMethod(new String[]{
           "user",
           "pass",
           "foo",
           "bar",
           ...
        });

      //rest of your code
    }

另外,另外,请确保在完成后关闭数据库。我个人会在每个方法中调用 getWritableDatabase,然后在方法结束时关闭数据库。比如:

public class DatabaseHelper extends SQLiteOpenHelper {

    Context c;

    public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);
    c = context;
    }

@Override
public void onCreate(SQLiteDatabase db) {

    db.execSQL("Create table " + TABLE_USERS +" (UserID INTEGER PRIMARY KEY AUTOINCREMENT, Forename TEXT, Surname TEXT, Email TEXT, Password TEXT, Country TEXT)");
db.execSQL("Create table " + TABLE_CAPACITY +" (CapacityID INTEGER PRIMARY KEY AUTOINCREMENT, Capacity INTEGER)");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_USERS);
db.execSQL("DROP TABLE IF EXISTS " + TABLE_CAPACITY);
onCreate(db);
}

public void sampleMethod(String[] arguments) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("Column1", arguments[0]);
    values.put("Column2", arguments[1]);
    values.put("Column3", arguments[2]);
    ....
    db.insert(TABLE_NAME, null, values);
    db.close();
}

【讨论】:

  • 上面写着“Column1”的地方,我应该用我要插入的表中的列替换这些列吗?
【解决方案2】:
  1. 在 DatabaseHelper 的构造函数之外声明“SQLiteDatabase db”实例。
  2. 在 DatabaseHelper 类中创建一个方法,该方法采用需要并插入 db 的参数
  3. 然后在您的活动中创建一个 DatabaseHelper 实例并调用您在第 2 步中创建的方法

请检查其他单例模式

【讨论】:

    【解决方案3】:

    为什么不通过将所有方法声明为静态来使 DatabaseHelper 成为单例对象?然后,您可以从活动中的任何位置调用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      相关资源
      最近更新 更多