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之前,您需要清除数组列表。 它会解决您的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值