PDA

View Full Version : کندی سرعت هنگام استفاده از execSQL



saeed_g21
پنج شنبه 06 شهریور 1393, 19:25 عصر
سلام دوستان و استاید محترم

وقتی (مستقیم) وصل میشم به SQLServer در کمترین زمان ممکن میتونم 10 فیلد با تعداد 424 ردیف (کمترینش) اطلاعات رو دریافت کنم تا اینجا مشکلی نیست
وقتی بخوام انهارو در SQLite ذخیره کنم زمان به 9ثانیه طول میشکه!!!
وقتی ردیفها زیاد بشه زمان هم زیاد طول میکشه

از نخ فرعی هم تست کردم نشد!

نحوه ذخیره سازیم هم به این صورت است

while(rs.next()){
String Name = rs.getString("name");

db.execSQL("insert into ... .");


}

چیکار کنم این مشکلم حل بشه ؟

پیشاپیش متشکرم از راهنمای هایتان

smemamian
پنج شنبه 06 شهریور 1393, 19:58 عصر
سلام
از Transaction استفاده کن.

در اینجا (http://www.codeofaninja.com/2013/12/android-sqlite-transaction-tutorial.html)آموزش کاملش رو گفته.

به تابع inserFast توجه کن.
(به تصاویر انتهایی لینک توجه کنی، تفاوت در سرعت ها رو متوجه میشی !!! )

saeed_g21
جمعه 07 شهریور 1393, 00:04 صبح
خیلی ممنونم از کمکتون واقعا عالی بود
ولی رو پروژه خودم راه اندازی کردم باز جواب نداد!
نهایتا 1 ثانیه زود تموم میشه

بنظرتون از چی میتونه باشه ؟

smemamian
جمعه 07 شهریور 1393, 01:28 صبح
اگه درست گفته باشم شما با سرعت دریافت اطلاعات از SQL Server مشکلی ندارید ؟

اطلاعات برگشتی از سرور رو در چه شیء ذخیره می کنید؟

saeed_g21
جمعه 07 شهریور 1393, 01:36 صبح
اگه درست گفته باشم شما با سرعت دریافت اطلاعات از SQL Server مشکلی ندارید ؟

اطلاعات برگشتی از سرور رو در چه شیء ذخیره می کنید؟


دقیقا
نسبت به سرعت اینترنت گوشی و سرور مرکزی از 1 ثانیه تا 5 ثانیه طول میکشه


راستشو بخوای هیچ جا
از همونجا که حلقه While زدم و شروع کردم به خواندن Row دیتابیس از همونجا می خونم همونجا هم insert میکنم به SQLite

smemamian
جمعه 07 شهریور 1393, 01:55 صبح
یک بار بدین صورت انجام بده :

برای این کار از ArrayList استفاده کن.
دو کلاس از AsyncTask بساز. در تابع doInBackground در AsyncOne مقادیر رو از SQL Server بگیر.
و سپس در تابع onPostExecute در AsyncOne، شیء AsyncTwo رو بساز تا در تابع doInBackground
آن اطلاعات رو در دیتابیس SQLite ذخیره کنه.

نکته: در تابع onPostExecute در AsyncTwo، شیء ArrayList رو با استفاده از تابع clear پاک کن :


import java.util.ArrayList;


import android.support.v7.app.ActionBarActivity;
import android.os.AsyncTask;
import android.os.Bundle;
public class MainActivity extends ActionBarActivity {

ArrayList<Test> arr_one ;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}



private class AsyncOne extends AsyncTask<Void, Void, Void>{


@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();

arr_one = new ArrayList<>();
}
@Override
protected Void doInBackground(Void... arg0) {
// TODO Auto-generated method stub

//fetch all of data from SQL server
arr_one =... ;
return null;
}

@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);

new AsyncTwo().execute((Void)null);
}


}


private class AsyncTwo extends AsyncTask<Void, Void, Void>{

@Override
protected Void doInBackground(Void... arg0) {
// TODO Auto-generated method stub
// store data to SQLite
db...arg0 = arr_one..
return null;
}

@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);

// you must delete all data
arr_one.clear();
}


}
}


در اینجا هم از Transaction استفاده کن.

saeed_g21
جمعه 07 شهریور 1393, 23:38 عصر
دریافت اطلاعت از سرور با 12500 ردیف و 10 فیلد پر : 26.203 ثانیه !!
ذخیره در دیتابیس : 1.933 ثانیه !!
حجم دیتابیس بعد از ذخیره سازی 1.9مگابایت

دستت طلا smemamian عزیز:قلب::بوس:

sara_traveler
شنبه 08 شهریور 1393, 12:20 عصر
الان شما برای اینکه اطلاعات از سرور بخونید از اینترنت سیم کارت استفاده می کنید دیگه؟
ایا سرعتش خوبه؟
چون من از سیم کارت ایرانسل که استفاده میکنم برای وصل شدن به دیتابیس سرور خیلی زمان میبره و خیلی اوقات حتی نمیتونه وصل بشه

ممنون میشم راهنماییم کنید

saeed_g21
شنبه 08 شهریور 1393, 15:17 عصر
الان شما برای اینکه اطلاعات از سرور بخونید از اینترنت سیم کارت استفاده می کنید دیگه؟ دقیقا
ایا سرعتش خوبه؟ بدنیست (البته بجز همراه اول آخه جدیدا ایرانسل هم شده 3G)
چون من از سیم کارت ایرانسل که استفاده میکنم برای وصل شدن به دیتابیس سرور خیلی زمان میبره و خیلی اوقات حتی نمیتونه وصل بشه (نه من همچین مشکلی ندارم البته اگه سرورمرکزی سرش شلوغ باشه از چندشهرستان مثلا(مشهد،تهران،اردبیل و... ) ریموت وصل میشن به مرکز(تبریز) کمی طول میکشه ولی نهایتا تا 20 ثانیه وصل میشه )
توجه : سرور آنتی ویروس داره ؟
فایروالش روشنه ؟
اینا کمی سرعتش رو میارن پایین

ممنون میشم راهنماییم کنید (درخدمتیم)