View Full Version : سوال در مورد دیتابیس SQLite
gilas1368
شنبه 05 اردیبهشت 1394, 21:00 عصر
سلام ب همگی
من ی سوال دارم و اونم اینه ک اگ همزمان 10تا یا بیشتر از 10 درخواست ب دیتابیس SQLite داده بشه آیا امکان داره این دیتابیس خطا بده یا قفل کنه یا ی مشکلی براش بوجود بیاد؟
iman0111
شنبه 05 اردیبهشت 1394, 21:30 عصر
سلام بزرگوار یادمه قبلا یه نفری این کارو انجام داده بود و روی گوشی های که قطعات سخت افزاری پایینی داشتن یه مقداری قفل می کرد و گیر داشت اما روی گوشی های مدل بالا با پردازنده های قدرتمند جواب میداد
HAMID484
شنبه 05 اردیبهشت 1394, 21:30 عصر
سلام
ببین چیزی که میگی خیلی جواب دقیقی نداره. بیشتر به سخت افزار و قدرت گوشی بستگی داره.
شما وقتی یک کانکشن به دیتابیس میزنی و open اش میکنی میتونی شروع کنی به ارسال دستورات مختلف به دیتابیس.
من خودم تا بحال به مشکلی نخوردم و شما فقط باید چیزی که مد نظرت هست رو بطور واقعی رو چند تا گوشی امتحان کنی
gilas1368
شنبه 05 اردیبهشت 1394, 21:40 عصر
سلام
ببین چیزی که میگی خیلی جواب دقیقی نداره. بیشتر به سخت افزار و قدرت گوشی بستگی داره.
شما وقتی یک کانکشن به دیتابیس میزنی و open اش میکنی میتونی شروع کنی به ارسال دستورات مختلف به دیتابیس.
من خودم تا بحال به مشکلی نخوردم و شما فقط باید چیزی که مد نظرت هست رو بطور واقعی رو چند تا گوشی امتحان کنی
سلام بزرگوار یادمه قبلا یه نفری این کارو انجام داده بود و روی گوشی های که قطعات سخت افزاری پایینی داشتن یه مقداری قفل می کرد و گیر داشت اما روی گوشی های مدل بالا با پردازنده های قدرتمند جواب میداد
ممنون بزرگواران
ببینید من 10 تا سرویس برای گرفتن دیتاهای موردنیازم در برنامه دارم
خروجی این سرویس ها JSON هستش
برای هرکدوم از این سرویس ها هم چون ماهیت هاشون متفاوت ی سرویس توی برنامه ام دارم ک داره توی بکگراند گوشی کاربر در فواصل زمانی معین سرویس های منو call میکنن و دیتاهای جدید یا آپدیت های لازمه رو میگیرن و روی دیتابیس اعمال میکنن
در پاره ای از مواقع برنامه خطای قفل بودن دیتا بیس رو بهم میده و میگ چون دیتابیس قفله من نمیتونم connection جدید بزنم
میخواستم ببینم ظرفیت اتصال دیتابیس SQLite چقدره؟
iman0111
شنبه 05 اردیبهشت 1394, 22:36 عصر
ببینید چون شما دارین تو یه پاره ی زمانی ثابت یه کار سنگین از دیتابیس میکشین و یه عملیات های رو به صورت زمانی هی پشت سر هم و نظیر به نظیر انجام میدین دیگه بعضی موقع سیستم کش نمیاره و باعث همچین خطایی میشه شما میتونید اگه این امکان براتون وجود داشته باشه همه ی این ده تا عمل رو همزمان با هم انجام ندین اینارو توی یه thrade جدا و با استفاده از کلاس asintask و کلاس handler به صورت بازاه ای انجام بدین مثلا با استفاده از کلاس هندلر یه زمانی رو مشخص کنید بر فرض مثال 5 ثانیه یا بیشتر بستگی به شرایط یه کویری رو براتون اجرا کنه و نتیجه رو نشون بده و مثلا 5 ثانیه بعد یه کویری دیگه اجرا بشه و همینجور تا اجرای اخرین کویری البته اگه به سیستم برنامتون بخوره این روش
tux-world
یک شنبه 06 اردیبهشت 1394, 00:05 صبح
این ربطی به تعداد دسترسی نداره. تو اندروید و جاوا و این سری اپلیکیشن ها شما خطای concurrent میگیرید یعنی خطای همزمان. یعنی همزمان سرویس میاد یه کار رو با سرویس دیگه همزمان انجام میده. برای این که مشکل حل بشه باید از سینکرونایزد استفاده کنی.
gilas1368
یک شنبه 06 اردیبهشت 1394, 08:08 صبح
این ربطی به تعداد دسترسی نداره. تو اندروید و جاوا و این سری اپلیکیشن ها شما خطای concurrent میگیرید یعنی خطای همزمان. یعنی همزمان سرویس میاد یه کار رو با سرویس دیگه همزمان انجام میده. برای این که مشکل حل بشه باید از سینکرونایزد استفاده کنی.
میشه خواهش کنم بیشتر توضیح بدید
از سینکرونایزد کجا باید استفاده کنم؟
متدهایی رو ک برای دسترسی و تراکنش روی بانک دارم رو باید سینک تعریف کنم؟
tux-world
یک شنبه 06 اردیبهشت 1394, 08:18 صبح
نه شما باید موقعی که کار یه وظیفه تموم نشده نباید اجازه بدید که درخواست دیگه ای وارد سرویس بشه. اولین شرط استفاده از IntentService هستش به جای Service و کد زیر رو ببینید
protected void onHandleIntent(Intent intent) {
UC.debugLog(traceElements, G.DEBUG, "Service try post data.");
synchronized (G.isReceving) {
if (G.isReceving) {
// Skip to retrive data from server
return;
} else {
G.isReceving = false;
}
}
}
G.isReceving یه متغیر بولین هستش که نگاه میکنم اگه true باشه یعنی در حال دریافته و باید منتظر بمونه. کارم تموم شد false میکنم.
gilas1368
یک شنبه 06 اردیبهشت 1394, 09:04 صبح
نه شما باید موقعی که کار یه وظیفه تموم نشده نباید اجازه بدید که درخواست دیگه ای وارد سرویس بشه. اولین شرط استفاده از IntentService هستش به جای Service و کد زیر رو ببینید
protected void onHandleIntent(Intent intent) {
UC.debugLog(traceElements, G.DEBUG, "Service try post data.");
synchronized (G.isReceving) {
if (G.isReceving) {
// Skip to retrive data from server
return;
} else {
G.isReceving = false;
}
}
}
G.isReceving یه متغیر بولین هستش که نگاه میکنم اگه true باشه یعنی در حال دریافته و باید منتظر بمونه. کارم تموم شد false میکنم.
ببینید این کلاس سرویس منه:
package ir.cvcreator.lams;
import android.app.IntentService;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.support.v4.app.NotificationCompat;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import ir.cvcreator.lams.Bll.ConfigManager;
/**
* This {@code IntentService} does the app's actual work.
* {@code SampleAlarmReceiver} (a {@code WakefulBroadcastReceiver}) holds a
* partial wake lock for this service while the service does its work. When the
* service is finished, it calls {@code completeWakefulIntent()} to release the
* wake lock.
*/
public class ProductBrandSchedulingService extends IntentService {
public ProductBrandSchedulingService() {
super("SchedulingService");
}
ProductReceiver productReceiver = new ProductReceiver();
public static final String TAG = "Scheduling Demo";
// An ID used to post the notification.
public static final int NOTIFICATION_ID = 1;
// The string the app searches for in the Google home page content. If the app finds
// the string, it indicates the presence of a doodle.
public static final String SEARCH_STRING = "doodle";
// The Google home page URL from which the app fetches content.
// You can find a list of other Google domains with possible doodles here:
// http://en.wikipedia.org/wiki/List_of_Google_domains
public static final String URL = "http://www.google.com";
private NotificationManager mNotificationManager;
NotificationCompat.Builder builder;
private MyDatabase db;
@Override
protected void onHandleIntent(Intent intent) {
// BEGIN_INCLUDE(service_onhandle)
// The URL from which to fetch content.
db=new MyDatabase(this);
if (checkConnection()) {
//new AbsoluteFactorAsyncTask().execute();
try {
GetProductBrand();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
//sendNotification(1,1234);
// Release the wake lock provided by the BroadcastReceiver.
ProductBrandReceiver.completeWakefulIntent(intent) ;
// END_INCLUDE(service_onhandle)
}
private boolean checkConnection() {
boolean connected = false;
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm != null) {
NetworkInfo[] netInfo = cm.getAllNetworkInfo();
for (NetworkInfo ni : netInfo) {
if ((ni.getTypeName().equalsIgnoreCase("WIFI")
|| ni.getTypeName().equalsIgnoreCase("MOBILE"))
& ni.isConnected() & ni.isAvailable()) {
connected = true;
}
}
}
return connected;
}
private boolean GetProductBrand() throws UnsupportedEncodingException {
HttpClient client = new DefaultHttpClient();
HttpGet post = new HttpGet("URL");
try {
HttpResponse response = client.execute(post);
int code = response.getStatusLine().getStatusCode();
if (code == 200) {
String result = StreamToString(response.getEntity().getContent());
JSONObject jsonObject = ConvertToJSON(result);
try {
JSONArray jsonArray = new JSONArray(result);
SaveProductBrand(jsonArray);
} catch (JSONException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
public String StreamToString(InputStream data) {
StringBuilder builder = new StringBuilder();
BufferedReader bfr = new BufferedReader(new InputStreamReader(data));
String line;
try {
while ((line = bfr.readLine()) != null) {
builder.append(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return builder.toString();
}
public JSONObject ConvertToJSON(String result) {
try {
return new JSONObject(result.substring(result.indexOf("{"), result.lastIndexOf("}") + 1));
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
private void SaveProductBrand(JSONArray result) {
for (int i = 0; i < result.length(); i++) {
try {
JSONObject jsonObject = result.getJSONObject(i);
int productBrandServerId = Integer.parseInt(jsonObject.getString("brand_id"));
int productServerId = Integer.parseInt(jsonObject.getString("category"));
int remove = Integer.parseInt(jsonObject.getString("updt"));
String productBrandName = jsonObject.getString("brand_name");
DatabaseManagement databaseManagement=new DatabaseManagement(this);
Cursor cursor = db.FindProductBrandByProductServerId(productBrandS erverId);
if (cursor.getCount() > 0) {
if (remove == 1) {
databaseManagement.RemoveProductBrand(productBrand ServerId);
} else if (remove == 2) {
databaseManagement.UpdateSubProductBrand(productBr andServerId, productServerId, productBrandName);
}
} else {
databaseManagement.SaveSubProductBrand(productBran dServerId, productServerId, productBrandName);
}
databaseManagement.close();
cursor.close();
db.close();
databaseManagement.close();
ConfigManager configManager = new ConfigManager(this);
String configValue = configManager.GetConfigByName("SubProductFirstLoop");
if (configValue.equals("0")) {
configManager.UpdateConfig("SubProductFirstLoop", "1");
}
} catch (JSONException e) {
e.printStackTrace();
}
}
productReceiver.cancelAlarm(this);
productReceiver.setAlarm(this);
}
}
و قالبا این خطا رو میخورم:
Error Report collected on : Sun Apr 26 09:29:40 IRST 2015
Informations :
==============
Version : 1.2
Package : ir.cvcreator.lams
FilePath : /data/data/ir.cvcreator.lams/files
Phone ModelHUAWEI U8950-1
Android Version : 4.0.4
Board : U8950-1
Brand : Huawei
Device : hwu8950-1
Display : U8950-1V100R001C00B963
Finger Print : Huawei/U8950-1/hwu8950-1:4.0.4/HuaweiU8950-1/C00B963:user/ota-rel-keys,release-keys
Host : huawei-desktop
ID : HuaweiU8950-1
Model : HUAWEI U8950-1
Product : U8950-1
Tags : release-keys
Time : 1362989343000
Type : user
User : huawei
Total Internal memory : 1188970496
Available Internal memory : 207192064
Stack :
=======
android.database.sqlite.SQLiteDatabaseLockedExcept ion: database is locked: , while compiling: PRAGMA journal_mode=TRUNCATE
at android.database.sqlite.SQLiteCompiledSql.native_c ompile(Native Method)
at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:78)
at android.database.sqlite.SQLiteProgram.compileSql(S QLiteProgram.java:134)
at android.database.sqlite.SQLiteProgram.compileAndbi ndAllArgs(SQLiteProgram.java:361)
at android.database.sqlite.SQLiteStatement.acquireAnd Lock(SQLiteStatement.java:271)
at android.database.sqlite.SQLiteStatement.simpleQuer yForString(SQLiteStatement.java:171)
at android.database.DatabaseUtils.stringForQuery(Data baseUtils.java:813)
at android.database.DatabaseUtils.stringForQuery(Data baseUtils.java:801)
at android.database.sqlite.SQLiteDatabase.setJournalM ode(SQLiteDatabase.java:1060)
at android.database.sqlite.SQLiteDatabase.openDatabas e(SQLiteDatabase.java:996)
at android.database.sqlite.SQLiteDatabase.openDatabas e(SQLiteDatabase.java:962)
at ir.cvcreator.lams.Bll.ConfigManager.GetConfigByNam e(ConfigManager.java:27)
at ir.cvcreator.lams.ProductBrandSchedulingService.Sa veProductBrand(ProductBrandSchedulingService.java: 179)
at ir.cvcreator.lams.ProductBrandSchedulingService.Ge tProductBrand(ProductBrandSchedulingService.java:1 11)
at ir.cvcreator.lams.ProductBrandSchedulingService.on HandleIntent(ProductBrandSchedulingService.java:65 )
at android.app.IntentService$ServiceHandler.handleMes sage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99 )
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60 )
**** End of current Report ***
tux-world
یک شنبه 06 اردیبهشت 1394, 09:17 صبح
خوب ببین لاک بودن دیتابیس عاملش چندتا میتونه باشه. یکی اینکه حدس میزنم شما پشت زمینه دیتابیس رو نمیبندی و حتی ممکن هستش که موقعی که سرویست داره کاری میکنه میخوایی ببندیش یا کار دیگه ای با دیتابیس بکنی .در کل توصیم بر اینه که از ORM هایی مثل GreenDao و یا ORMLite استفاده کنی. من با لایت کار میکنم و تازه شروع کردم البته. به یه آرامشی رسیدم خداییش :لبخندساده:
gilas1368
یک شنبه 06 اردیبهشت 1394, 09:49 صبح
خوب ببین لاک بودن دیتابیس عاملش چندتا میتونه باشه. یکی اینکه حدس میزنم شما پشت زمینه دیتابیس رو نمیبندی و حتی ممکن هستش که موقعی که سرویست داره کاری میکنه میخوایی ببندیش یا کار دیگه ای با دیتابیس بکنی .در کل توصیم بر اینه که از ORM هایی مثل GreenDao و یا ORMLite استفاده کنی. من با لایت کار میکنم و تازه شروع کردم البته. به یه آرامشی رسیدم خداییش :لبخندساده:
منم دارم روی ormlite کار میکنم الان( البته تازه کارم تو این زمینه) فقط موندم ک آیا میشه روی دیتابیس های پیش ساخته هم ازش استفاده کرد یا باید برای تمام جداولت کلاسش رو بسازی و بعد بهش بگی ک اون جدول رو برات بسازه
چطوری باید خوده دیتابیس رو باهاش بسازی؟
رشته اتصالش رو چی باید بنویسی؟
چطوری باید تراکنش ها روش اجرا کنی؟
یکمی گیج شدم در استفاده ازش
اگ شما اطلاعاتی دارید ممنون میشم راهنمائیم کنین
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.