【发布时间】:2016-03-09 08:41:42
【问题描述】:
我完成了一些教程,但它们都很简单,无法在我的解决方案中使用。
我通过 JDBC MySQL 连接到数据库。
public class ConnCore extends AsyncTask<Void, Void, Boolean> {
Activity activity;
Context context;
public ConnCore(Context context, Activity currActivity) {
this.context = context.getApplicationContext();
this.activity = currActivity;
}
@Override
protected Boolean doInBackground(Void... params) {
try{Class.forName("com.mysql.jdbc.Driver");}
catch(Exception e){
DataStore.DataStoreClass.connExc = e;
return false;}
try{
DataStore.DataStoreClass.mysqlConn = DriverManager.getConnection(DataStore.DataStoreClass.connectionString);
return true;
}catch(Exception e){
DataStore.DataStoreClass.connExc = e;
return false;
}
}
@Override
protected void onPostExecute (Boolean b) {
if(b == true) {
Intent intent = new Intent(context, DBList.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
} else {
AlertDialog alertDialog = new AlertDialog.Builder(activity).create();
alertDialog.setTitle("Error");
alertDialog.setMessage(DataStore.DataStoreClass.connExc.toString());
alertDialog.show();
}
}
这将与此字符串相关:
static String connectionString = "jdbc:mysql://XXX.XXX.XXX.XXX:3306?user=root&password=test&autoReconnect=true&failOverReadOnly=false&maxReconnects=10";
如果连接成功,它会启动新的活动 DBList,它会启动新的 AsyncTask 以获取数据库。 AsyncTask 看起来像这样:
public class GetDBList extends AsyncTask<Void, Void, Boolean> {
Activity activity;
Context context;
public GetDBList(Context context, Activity activity){
this.activity = activity;
this.context = context;
}
@Override
protected Boolean doInBackground(Void... params){
Statement stmt = null;
String query = "SHOW DATABASES";
DataStore.DataStoreClass.DBResponse = new ArrayList<String>();
try {
DatabaseMetaData meta = DataStore.DataStoreClass.mysqlConn.getMetaData();
ResultSet res = meta.getCatalogs();
while (res.next()) {
DataStore.DataStoreClass.DBResponse.add(res.getString("TABLE_CAT"));
}
res.close();
return true;
}
catch (SQLException e){
AlertDialog alertDialog = new AlertDialog.Builder(activity).create();
alertDialog.setTitle("Error");
alertDialog.setMessage(e.toString());
alertDialog.show();
return false;
}
}
@Override
protected void onPostExecute(Boolean b){
if(b) {
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, DataStore.DataStoreClass.DBResponse){
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
TextView text = (TextView) view.findViewById(android.R.id.text1);
text.setTextColor(Color.BLACK);
return view;
}
};
ListView lv = (ListView) activity.findViewById(R.id.db_lv);
lv.setAdapter(arrayAdapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
DataStore.DataStoreClass.currentDB = ((TextView) view).getText().toString();
Toast.makeText(context, DataStore.DataStoreClass.currentDB,
Toast.LENGTH_SHORT).show();
AlertDialog alertDialog = new AlertDialog.Builder(activity).create();
alertDialog.setTitle("Error");
alertDialog.setMessage(DataStore.DataStoreClass.connExc.toString());
alertDialog.show();
}
});
}
}
}
到目前为止,一切正常,我可以获取带有数据库的 ListView。
现在。每个 List_Item 都有 onClickListener。 如何将字符串值(包含数据库名称)传递给现有连接以获取其表?
每个教程都已经有了数据库的名称。我正在尝试创建一个通用数据库客户端,所以您实际上不知道服务器上有哪些数据库。
String url = "jdbc:mysql://" + serverName + "/" + schema;
我不想关闭以前的连接并直接与数据库建立一个新连接
那么有没有可能“编辑”
(static Connection mysqlConn;)
DataStore.DataStoreClass.mysqlConn = DriverManager.getConnection(DataStore.DataStoreClass.connectionString);
不知何故...或任何其他方式?
谢谢。
【问题讨论】:
-
首先 - 它可以连接访问多个数据库。只要用户对他们有oermissions就可以了。
-
@Jan 我想,你没有明白这一点。我能够列出数据库。然后,我需要从返回的列表中选择一个,并获取它的表格列表。我的问题是,当所有教程都在计算“我在创建连接时知道数据库名称”时该怎么做 - 而我不知道。我需要从列表中选择数据库,我无法将其硬核到解决方案中。我一次只需要编辑一个数据库
-
"显示来自 " + dbname 的表
-
抱歉 - 在移动设备上。换句话说:即使您没有通过连接字符串连接到该数据库,您也可以列出表、读取数据等。您甚至可以执行“使用”+dbname as sql,从而更改活动连接的默认数据库。
-
您可以在没有数据库名称的情况下连接到数据库 String url="jdbc:mysql://{hostname}:{port}" 并且查询时必须附加{dbname} 例如 select * from dbname.dbtable