mehdi.safavie
سه شنبه 28 مهر 1394, 15:30 عصر
درود;
دوستان یه برنامه نوشتم که به SQL روی هاست وصل میشه و عملیات های Insert , Update , Delete و Show رو انجام میده .
تو 3 قسمت اول مشکلی نیست ولی برای این که اطلاعات رو در ListView نمایش بده یه مشکلی هست .
تو کلاس مربوط به Database یه متد گذاشتم که تمام اطلاعات رو از سرور SELECT میکنه .
* نکته : برای این که از سرور یه صورت اینترنتی اطلاعات رو دریافت کنیم حتما باید کد هاش رو داخل یک Thread یا BackGround بنویسیم ( که من هنوز نتونستم با @BackGround کار کنم )
خب متد من به این شکله :
زمانی که متد فراخوانی میشه اول Thread استارت میشه و در خط بعد اطلاعات داخل یک Araye برگردانده میشه . داخل Thread هم اون Araye من پر میشه .
ولی زمانی که Thread میخواد با دیتابیس ارتباط برقرار کنه مدت زمانی طول میکشه ، بعد از اتصال هم تازه میاد Araye رو پر میکنه .
این در صورتیه که قبل از این که Araye در داخل Thread پر بشه تو متد من یه Araye خالی برگردونده شده .
اگر گیج کننده بود توضیحام ، کدش رو میزارم دوباره توضیح میدم ، اگر هم که نه نیازی نیست این توضیح دوباره رو بخونین ، ممنون :
List<Data_Member> contacts = new ArrayList<Data_Member>();
String SQL_Queryy, Error_Messagee;
boolean Show_Messagee;
public List<Data_Member> get_All_Members_SQLExPRESS() {
thread2.start();
return contacts;
}
Thread thread2 = new Thread(new Runnable(){
@Override
public void run() {
try {
Log.i("Android", " MySQL Connect Example.");
Connection conn = null;
String driver = "net.sourceforge.jtds.jdbc.Driver";
Class.forName(driver).newInstance();
//test = com.microsoft.sqlserver.jdbc.SQLServerDriver.class ;
String connString = "jdbc:jtds:sqlserver://xx.xx.xx.xx:1433/xxDatabasexx;encrypt=fasle;user=xxxxxxxxxx;passwor d=xxxxxxxxxx;instance=SQLEXPRESS;";
String username = "xxxxxxxxxx";
String password = "xxxxxxxxxx";
conn = DriverManager.getConnection(connString, username, password);
Log.w("Connection", "open");
Statement stmt = conn.createStatement();
ResultSet reset = stmt.executeQuery("SELECT * FROM TB_Sabt");
// Print the data to the console
while (reset.next()) {
Log.w("Data:", reset.getString(3));
//Log.w("Data",reset.getString(2));
Data_Member member = new Data_Member();
member.set_FieldID(reset.getLong(1));
member.set_Field1(reset.getString(3));
member.setFIeld2(reset.getString(4));
member.setField3(reset.getString(5));
contacts.add(member);
}
conn.close();
Show_Messagee = true;
MA.refreshList();
}
catch (Exception ex)
{
Show_Messagee = false;
if(Show_Messagee == false)
{
Error_Messagee = ex.toString();
}
}
}
});
ببینید ، اول Thread استارت شده بعد return شده .
قبل از این که Thread بیاد contacts رو پر کنه ، یه contacts خالی برگردونده میشه . بعد که Thread کارش تموم میشه و contacts پر میشه دیگه کار از کار گذشته و فایده نداره .
برای این مشکل باید چه راه حلی بزارم ؟
دوستان یه برنامه نوشتم که به SQL روی هاست وصل میشه و عملیات های Insert , Update , Delete و Show رو انجام میده .
تو 3 قسمت اول مشکلی نیست ولی برای این که اطلاعات رو در ListView نمایش بده یه مشکلی هست .
تو کلاس مربوط به Database یه متد گذاشتم که تمام اطلاعات رو از سرور SELECT میکنه .
* نکته : برای این که از سرور یه صورت اینترنتی اطلاعات رو دریافت کنیم حتما باید کد هاش رو داخل یک Thread یا BackGround بنویسیم ( که من هنوز نتونستم با @BackGround کار کنم )
خب متد من به این شکله :
زمانی که متد فراخوانی میشه اول Thread استارت میشه و در خط بعد اطلاعات داخل یک Araye برگردانده میشه . داخل Thread هم اون Araye من پر میشه .
ولی زمانی که Thread میخواد با دیتابیس ارتباط برقرار کنه مدت زمانی طول میکشه ، بعد از اتصال هم تازه میاد Araye رو پر میکنه .
این در صورتیه که قبل از این که Araye در داخل Thread پر بشه تو متد من یه Araye خالی برگردونده شده .
اگر گیج کننده بود توضیحام ، کدش رو میزارم دوباره توضیح میدم ، اگر هم که نه نیازی نیست این توضیح دوباره رو بخونین ، ممنون :
List<Data_Member> contacts = new ArrayList<Data_Member>();
String SQL_Queryy, Error_Messagee;
boolean Show_Messagee;
public List<Data_Member> get_All_Members_SQLExPRESS() {
thread2.start();
return contacts;
}
Thread thread2 = new Thread(new Runnable(){
@Override
public void run() {
try {
Log.i("Android", " MySQL Connect Example.");
Connection conn = null;
String driver = "net.sourceforge.jtds.jdbc.Driver";
Class.forName(driver).newInstance();
//test = com.microsoft.sqlserver.jdbc.SQLServerDriver.class ;
String connString = "jdbc:jtds:sqlserver://xx.xx.xx.xx:1433/xxDatabasexx;encrypt=fasle;user=xxxxxxxxxx;passwor d=xxxxxxxxxx;instance=SQLEXPRESS;";
String username = "xxxxxxxxxx";
String password = "xxxxxxxxxx";
conn = DriverManager.getConnection(connString, username, password);
Log.w("Connection", "open");
Statement stmt = conn.createStatement();
ResultSet reset = stmt.executeQuery("SELECT * FROM TB_Sabt");
// Print the data to the console
while (reset.next()) {
Log.w("Data:", reset.getString(3));
//Log.w("Data",reset.getString(2));
Data_Member member = new Data_Member();
member.set_FieldID(reset.getLong(1));
member.set_Field1(reset.getString(3));
member.setFIeld2(reset.getString(4));
member.setField3(reset.getString(5));
contacts.add(member);
}
conn.close();
Show_Messagee = true;
MA.refreshList();
}
catch (Exception ex)
{
Show_Messagee = false;
if(Show_Messagee == false)
{
Error_Messagee = ex.toString();
}
}
}
});
ببینید ، اول Thread استارت شده بعد return شده .
قبل از این که Thread بیاد contacts رو پر کنه ، یه contacts خالی برگردونده میشه . بعد که Thread کارش تموم میشه و contacts پر میشه دیگه کار از کار گذشته و فایده نداره .
برای این مشکل باید چه راه حلی بزارم ؟