访问在 MainActivity 中创建的 SQLiteOpenHelper
Access to SQLiteOpenHelper created in MainActivity
我在 MainActivity 中创建了一个 SQLiteOpenHelper 对象:
public class ExchangeActivity extends AppCompatActivity {
public CurrencyDBHelper db;
private Handler handler;
private int delay = 30000;
private DataHandler dataHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
//create CurrencyDBHelper object
db = new CurrencyDBHelper(this);
Log.v("DBTag", "DB created");
//Activity and UI
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_exchange);
}}
我的 CurrencyDBHelper class 代码:
public class CurrencyDBHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "LastCurrency.db";
//constructor
public CurrencyDBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE CURRENCY ("
+ "_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ "NAME TEXT, "
+ "RATE REAL); ");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
我需要从另一个 class 呼叫 db
。我怎样才能从另一个 class 做到这一点?
我尝试不在 MainActivity 中创建 SQLiteOpenHelper,但它对我不起作用。看来我必须使用 Context,但我不明白为什么要这样做。
请帮忙。
谢谢!
1) 将 DBHelper class 移动到它自己的 class 即 CurrencyDBHelper.java 应该是 :-
public class CurrencyDBHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "LastCurrency.db";
//constructor
public CurrencyDBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE CURRENCY ("
+ "_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ "NAME TEXT, "
+ "RATE REAL); ");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
2) 在activity中你要使用的数据库使用:-
db = new CurrencyDBHelper(this);
Note! this will NOT create the database. The database will only be
created when an attempt is made to open it e.g. the
getWRiteableDatabase
or the getReadableDatabase
is called.
所以 3)
SQLiteDatabase mydb = db.getWritableDatabase();
将导致创建数据库(即调用 DBHelper 的 onCreate
方法)。
Note! onCreate will only be called once for the lifetime of the
database file. As such if you want to amend the structure of the
database, when developing it's probably easiest to clear the Apps Data
or uninstall and then re-install the App.
在此阶段 table 中将没有数据。
但是您可以查询空的 table 例如:-
Cursor csr = mydb.query("CURRENCY",null,null,null,null,null,null,null);
Log.v("MYDB","Table CURRENCY has " +
Integer.toString(csr.getCount()) +
" rows"
);
for (int i=0; i < csr.getColumnCount(); i++) {
Log.v("MYDB","Table CURRENCY has a column named " +
csr.getColumnName(i)
);
}
csr.close();
然后使用 activity 可以是:-
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
db = new CurrencyDBHelper(this);
SQLiteDatabase mydb = db.getWritableDatabase();
Cursor csr = mydb.query("CURRENCY",null,null,null,null,null,null,null);
Log.v("MYDB","Table CURRENCY has " +
Integer.toString(csr.getCount()) +
" rows"
);
for (int i=0; i < csr.getColumnCount(); i++) {
Log.v("MYDB","Table CURRENCY has a column named " +
csr.getColumnName(i)
);
}
csr.close();
}
日志的输出将是这样的:-
07-21 17:38:07.290 1886-1886/mjt.cardoniser V/MYDB: Table CURRENCY has 0 rows
07-21 17:38:07.290 1886-1886/mjt.cardoniser V/MYDB: Table CURRENCY has a column named _id
07-21 17:38:07.290 1886-1886/mjt.cardoniser V/MYDB: Table CURRENCY has a column named NAME
07-21 17:38:07.290 1886-1886/mjt.cardoniser V/MYDB: Table CURRENCY has a column named RATE
我在 MainActivity 中创建了一个 SQLiteOpenHelper 对象:
public class ExchangeActivity extends AppCompatActivity {
public CurrencyDBHelper db;
private Handler handler;
private int delay = 30000;
private DataHandler dataHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
//create CurrencyDBHelper object
db = new CurrencyDBHelper(this);
Log.v("DBTag", "DB created");
//Activity and UI
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_exchange);
}}
我的 CurrencyDBHelper class 代码:
public class CurrencyDBHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "LastCurrency.db";
//constructor
public CurrencyDBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE CURRENCY ("
+ "_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ "NAME TEXT, "
+ "RATE REAL); ");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
我需要从另一个 class 呼叫 db
。我怎样才能从另一个 class 做到这一点?
我尝试不在 MainActivity 中创建 SQLiteOpenHelper,但它对我不起作用。看来我必须使用 Context,但我不明白为什么要这样做。
请帮忙。 谢谢!
1) 将 DBHelper class 移动到它自己的 class 即 CurrencyDBHelper.java 应该是 :-
public class CurrencyDBHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "LastCurrency.db";
//constructor
public CurrencyDBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE CURRENCY ("
+ "_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ "NAME TEXT, "
+ "RATE REAL); ");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
2) 在activity中你要使用的数据库使用:-
db = new CurrencyDBHelper(this);
Note! this will NOT create the database. The database will only be created when an attempt is made to open it e.g. the
getWRiteableDatabase
or thegetReadableDatabase
is called.
所以 3)
SQLiteDatabase mydb = db.getWritableDatabase();
将导致创建数据库(即调用 DBHelper 的 onCreate
方法)。
Note! onCreate will only be called once for the lifetime of the database file. As such if you want to amend the structure of the database, when developing it's probably easiest to clear the Apps Data or uninstall and then re-install the App.
在此阶段 table 中将没有数据。
但是您可以查询空的 table 例如:-
Cursor csr = mydb.query("CURRENCY",null,null,null,null,null,null,null);
Log.v("MYDB","Table CURRENCY has " +
Integer.toString(csr.getCount()) +
" rows"
);
for (int i=0; i < csr.getColumnCount(); i++) {
Log.v("MYDB","Table CURRENCY has a column named " +
csr.getColumnName(i)
);
}
csr.close();
然后使用 activity 可以是:-
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
db = new CurrencyDBHelper(this);
SQLiteDatabase mydb = db.getWritableDatabase();
Cursor csr = mydb.query("CURRENCY",null,null,null,null,null,null,null);
Log.v("MYDB","Table CURRENCY has " +
Integer.toString(csr.getCount()) +
" rows"
);
for (int i=0; i < csr.getColumnCount(); i++) {
Log.v("MYDB","Table CURRENCY has a column named " +
csr.getColumnName(i)
);
}
csr.close();
}
日志的输出将是这样的:-
07-21 17:38:07.290 1886-1886/mjt.cardoniser V/MYDB: Table CURRENCY has 0 rows
07-21 17:38:07.290 1886-1886/mjt.cardoniser V/MYDB: Table CURRENCY has a column named _id
07-21 17:38:07.290 1886-1886/mjt.cardoniser V/MYDB: Table CURRENCY has a column named NAME
07-21 17:38:07.290 1886-1886/mjt.cardoniser V/MYDB: Table CURRENCY has a column named RATE