java sqlite 创建_关于Java:创建3个由sqlite数据库填充的微调器
我正在嘗試實現一個活動,該活動具有3個微調器(下拉列表),每個微調器由sqlite數據庫中的不同表填充。 我設法創建了一個已正確填充的微調器,但是在創建其他兩個并正確填充它們時遇到了麻煩。
到目前為止,這是我的主要活動:
public class MainActivity extends Activity implements OnClickListener, OnItemSelectedListener {
private DBManager data;
private SQLiteDatabase db;
private final String DB_NAME ="hanakolfein.s3db";
private Spinner spinner;
List list;
ArrayAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*Spinner sp1, sp2, sp3;
sp1 = (Spinner) findViewById(R.id.spinner1);
sp2 = (Spinner) findViewById(R.id.spinner2);
sp3 = (Spinner) findViewById(R.id.spinner3);
sp1.setOnItemSelectedListener(null);
sp2.setOnItemSelectedListener(null);
sp3.setOnItemSelectedListener(null); */
data = new DBManager(this, DB_NAME);
db = data.openDataBase();
spinner = (Spinner) findViewById(R.id.spinner1);
spinner.setOnItemSelectedListener(this);
loadSpinner();
}
private void loadSpinner() {
Set set = data.getAllData();
List list = new ArrayList(set);
adapter = new ArrayAdapter(MainActivity.this,
android.R.layout.simple_spinner_item, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setWillNotDraw(false);
}
@Override
public void onItemSelected(AdapterView< ? > parent, View view,
int position, long id) {
// TODO Auto-generated method stub
}
@Override
public void onNothingSelected(AdapterView< ? > parent) {
// TODO Auto-generated method stub
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
}
這是我的數據庫管理器:
公共類DBManager擴展了SQLiteOpenHelper {
//Path to the device folder with databases
public static String DB_PATH;
//Database file name
public static String DB_NAME;
public SQLiteDatabase database;
public final Context context;
public final static int DB_VERSION = 6;
public SQLiteDatabase getDb() {
return database;
}
public DBManager(Context context, String databaseName) {
super(context, databaseName, null, DB_VERSION);
this.context = context;
//full path to the databases
String packageName = context.getPackageName();
DB_PATH = String.format("//data//data//%s//databases//", packageName);
DB_NAME = databaseName;
openDataBase();
}
//This piece of code will create a database if it’s not yet created
public void createDataBase() {
boolean dbExist = checkDataBase();
if (!dbExist) {
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
Log.e(this.getClass().toString(),"Copying error");
throw new Error("Error copying database!");
}
} else {
Log.i(this.getClass().toString(),"Database already exists");
}
}
//Performing a database existence check
private boolean checkDataBase() {
SQLiteDatabase checkDb = null;
try {
String path = DB_PATH + DB_NAME;
checkDb = SQLiteDatabase.openDatabase(path, null,SQLiteDatabase.OPEN_READONLY);
} catch (SQLException e) {
Log.e(this.getClass().toString(),"Error while checking db");
}
//Android doesn’t like resource leaks, everything should
// be closed
if (checkDb != null) {
checkDb.close();
}
return checkDb != null;
}
//Method for copying the database
private void copyDataBase() throws IOException {
//Open a stream for reading from our ready-made database
//The stream source is located in the assets
InputStream externalDbStream = context.getAssets().open(DB_NAME);
//Path to the created empty database on your Android device
String outFileName = DB_PATH + DB_NAME;
//Now create a stream for writing the database byte by byte
OutputStream localDbStream = new FileOutputStream(outFileName);
//Copying the database
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = externalDbStream.read(buffer)) > 0) {
localDbStream.write(buffer, 0, bytesRead);
}
//Don’t forget to close the streams
localDbStream.close();
externalDbStream.close();
}
public SQLiteDatabase openDataBase() throws SQLException {
String path = DB_PATH + DB_NAME;
if (database == null) {
createDataBase();
database = SQLiteDatabase.openDatabase(path, null,
SQLiteDatabase.OPEN_READWRITE);
}
return database;
}
@Override
public synchronized void close() {
if (database != null) {
database.close();
}
super.close();
}
public Set getAllData() {
Set set = new HashSet();
String selectQuery ="select * from cuisine";
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
set.add(cursor.getString(1));
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return set;
}
@Override
public void onCreate(SQLiteDatabase db) {}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}
"我在創建另外兩個時遇到麻煩",您應該更詳細地確切說明自己遇到的麻煩。
很好地創建第一個,我使用了loadSpinner內部的getAllData來填充它,在另外兩個中,我是否還要再創建2個具有不同查詢的getAllData? 我是否要創建另一個loadSpinner? 我不確定如何進行@Takendarkk
好吧,首先,您不應該從主線程查詢數據庫。
我建議按照此處所述使用裝載程序。 在每種情況下,對于每個微調框,您可以根據需要設置任意數量的裝載程序(只需確保為它們指定不同的ID)即可。
您需要清除傳遞給arrayadapter的那個arraylist。 因為當您使用第一個微調器時,您要調用gatAllData并將該數據存儲在arraylist中,然后將其傳遞給arrayadapter。 下次使用第二個微調器時,您將執行相同的步驟,但它將連接到arraylist的先前條目。 因此,在調用getAllData之前,您需要清除數組列表。 它會解決您的問題。
總結
以上是生活随笔為你收集整理的java sqlite 创建_关于Java:创建3个由sqlite数据库填充的微调器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python拥有庞大的计算生态_Pyth
- 下一篇: 32岁妈妈适合转行做软件测试吗,32+大