【问题标题】:Programmatically call rawQuery when app starts应用程序启动时以编程方式调用 rawQuery
【发布时间】:2016-10-04 18:18:46
【问题描述】:

我们有这两个类 MainActivity 和一个 DBHelper

DBHelper 创建数据库和两个表一个表masterPW,它将只有一行和两列IDColPW。一旦创建并插入数据,该表将只包含一条记录。

应用启动时,ColPW 列将为空或 null 第一次。

我们希望在应用启动时以编程方式调用rawQuery,并将ColPW 列的值设置为String

如果字符串变量为 null 或为空,则显示 MainActivity 两个EditText 字段和保存按钮。如果字符串变量获得 来自ColPW 列的数据。 MainActivity 将只显示一个 EditText 字段和 ENTER 按钮。

作为真正的 Android 新手,我不知道如何制作 应用程序以编程方式调用rawQuery。我应该把rawQuery放在哪里?

如果查询结果在DBHelper类中,如何发送 结果到MainActivity?意图,全局单例类,或 使用带有 getter 和 setter 以及 Adapter 类的模型类?

我已经用 DerbyDB 和 JavaFX 编写了这个,但我可以打开 并创建表查询同一个类中的表

    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;

    public class MainActivity extends AppCompatActivity {

        Button btnSave;
        Button btnEnter;
        TextView tvPW;
        TextView tvCPW;
        EditText etPW;
        EditText etCPW;
        int x = 1;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
            setContentView( R.layout.activity_main );
            tvPW = (TextView) findViewById( R.id.tvPW );
            tvCPW = (TextView) findViewById( R.id.tvCPW );
            etPW = (EditText) findViewById( R.id.etPW );
            etCPW = (EditText) findViewById( R.id.etCPW );

            btnEnter = (Button) findViewById( R.id.btnEnter );
            btnSave = (Button) findViewById( R.id.btnSave );
            addListenerOnButtonSave();

            DBHelper dbHelper = new DBHelper( this );
            String str = dbHelper.getCol_PW();
            if (str == null || str.isEmpty()) {
                System.out.println( "I am null" );
            } else {
                System.out.println( "I am NOT NULL" );
            }
        }

        private void addListenerOnButtonSave() {
        btnSave.setOnClickListener( new View.OnClickListener() {

       @Override
       public void onClick(View v) {

       if (x == 1) {
       btnSave.setVisibility( View.INVISIBLE );
       btnEnter.setVisibility( View.VISIBLE );
       tvCPW.setVisibility( View.INVISIBLE );
       etCPW.setVisibility( View.INVISIBLE );
       etPW.requestFocus();
       setTitle( "Enter Password" );

       }

       }
       } );
       }
    }
    import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {

    public static final String DB_NAME = "PassWord";
    public static final Integer DB_VERSION = 1;

    public static final String TABLE_NAME = "masterPW";
    public static final String Col_ID = "ID";
    public static final String Col_MPW = "mpw";

    private static final String MAKE_TABLE = "CREATE TABLE " +  TABLE_NAME +
            "(" + Col_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + Col_MPW + " TEXT" + ")";

    SQLiteDatabase db;


    public DBHelper(Context context){
        super(context,DB_NAME,null,DB_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL( MAKE_TABLE );
    }

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

    public String getCol_PW(){
        String str = null;
        String q = "SELECT mpw FROM masterPW";
        Cursor cursor = db.rawQuery(q,null);
        if(cursor.moveToFirst()){
            str = cursor.getString(cursor.getColumnIndex(Col_MPW));
        }
        return str;
    }
}

【问题讨论】:

  • 一个吸气剂 - 在 DBHelper 中。这就是你所需要的。然后,在 Activity 的onCreate 中创建一个DBHelper 的实例。不需要单身人士。 SQLite 不处理 Intent。欢迎您为某些 ORM 目的创建模型,但这不是您的目的所必需的

标签: android sqlite android-sqlite


【解决方案1】:

在您的 MainActivity onCreate 中尝试这样做:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    DBHelper dbHelper = new DBHelper(this);
    String str = dbHelper.getColPW();
    if(str == null || str.isEmpty()){
        //display 2 edittext
    } else {
        //display 1 edittext
    }

}

在 DBHelper.java 中:

private SQLiteDatabase myDataBase;
public String getColPW(){
    String str = null;
    myDataBase = getWritableDatabase();
    Cursor cursor = myDataBase.rawQuery("select " + COL_MPW + " from " + TABLE_NAME, null);
    if(cursor.moveToFirst()){
        str = cursor.getString(cursor.getColumnIndex(COL_MPW));
    }
    return str;
}

如有疑问,请在 cmets 中提问。

【讨论】:

  • 所以我仍然在 DBHelper 类中创建我的数据库和表?以及 MainActivity DBHelper dbHelper = new DBHelper(this) 和 String str = dbHelper.getColPW(); 中的代码行将在 DBHelper 类中执行该方法如果可行,我将尝试并投票我的另一个问题是这个线程保存?
  • 你能发布你的 DBHelper 课程吗?
  • 应该是"select mpw""select " + DBHelper.Col_MPW + " from ..."
  • 什么错误代码?并请发布您更新的 DBHelper 和 MainActivity。
  • db 变量可能为空,我认为您必须在调用 rawQuery() 之前对其进行初始化,例如 db = getWritableDatabase()。请查看更新后的代码,如示例。
猜你喜欢
  • 2011-03-27
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多