PDA

View Full Version : آموزش : کار با دیتابیس SQLite به زبان ساده بدون نیاز به کلاس DataBaseHelper



صفحه : [1] 2

poorman
جمعه 25 بهمن 1392, 00:50 صبح
سلام


این مطلب در سال ۱۳۹۲ نوشته شده، آموزش کامل‌تر و جامع‌تری رو داریم تهیه میکنیم که میتونید در آدرس‌های زیر مطالعه کنید.


بخش اول: آشنایی با دیتابیس - ساخت جدول و وارد کردن اطلاعات به جدول (http://bobardo.com/blog/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-%d8%af%db%8c%d8%aa%d8%a7%d8%a8%db%8c%d8%b3-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af-1/)

بخش دوم: خواندن اطلاعات از جدول و استفاده از اونها (http://bobardo.com/blog/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-%d8%af%db%8c%d8%aa%d8%a7%d8%a8%db%8c%d8%b3-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af-2/)

بخش سوم: آپدیت و حذف کردن اطلاعات درون جدول (http://bobardo.com/blog/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-%d8%af%db%8c%d8%aa%d8%a7%d8%a8%db%8c%d8%b3-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af-3/)

بخش چهارم: پیاده سازی دیتابیس پیشرفته اندروید با استفاده از کلاس ها (http://bobardo.com/blog/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-%d8%af%db%8c%d8%aa%d8%a7%d8%a8%db%8c%d8%b3-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af-4/)

بخش پنجم: پیاده سازی گام به گام نمونه پروژه دیتابیس پیشرفته (http://bobardo.com/blog/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-%d8%af%db%8c%d8%aa%d8%a7%d8%a8%db%8c%d8%b3-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af-5/)

بخش ششم: آموزش استفاده از دیتابیس آماده اندروید (http://bobardo.com/blog/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-%d8%af%db%8c%d8%aa%d8%a7%d8%a8%db%8c%d8%b3-%d8%a2%d9%85%d8%a7%d8%af%d9%87-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af/)

-----------------------------------------------------------------------------------------------

توی این پست ابتدا ساخت دستی دیتابیس و سپس کار با دیتابیس رو یاد میگیرید

درصورتی که میخواین با دیتابیس آماده کار کنین این پست (http://barnamenevis.org/showthread.php?441406-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-SQLite-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-%D8%A8%D8%AF%D9%88%D9%86-%D9%86%DB%8C%D8%A7%D8%B2-%D8%A8%D9%87-%DA%A9%D9%84%D8%A7%D8%B3-DataBaseHelper&p=1987677&viewfull=1#post1987677) رو مشاهده کنین

-----------------------------------------------------------------------------------------------------------------------

واقعیت اینه که من از همون اول نتونستم با پیچیدگی کلاس DataBaseHelper ارتباط خوبی برقرار کنم ، به همین خاطر خیلی ساده و ابتدایی میخوام کار با دیتابیس رو بدون پیچیدگی آموزش بدم
باشد که خدا از ما راضی باشد :خجالت:

برای دیتابیس چند تا پارامتر داریم ، یکی شیء دیتابیس که اینطوری تعریف میشه

SQLiteDatabase mydb;
بعد نام دیتابیسی که میخوایم ایجاد کنیم یا ازش استفاده کنیم

private static String DBNAME = "PERSONS"; // THIS IS THE SQLITE DATABASE FILE NAME.

بعد نام جدول یا جدول های دیتابیس رو برای استفاده تعریف میکنید ، اگر با مفهوم جدول آشنا نیستید باید بگم بخشی از دیتابیس هست که شما می تونید اطلاعات مربوط به یک موضوع یا اصطلاحا موجودیت خاص رو ذخیره کنید

private static String TABLE = "MY_TABLE"; // THIS IS THE TABLE NAME

خب تا اینجا شما هیچ کار نکردید ، فقط اطلاعات دیتابیس رو برای استفاده مشخص کردید
حالا با این کد ما یک دیتابیس با اسمی که در بالا مشخص کردیم رو درست میکنیم و اگر این دیتابیس قبلا وجود داشت بازش میکنیم تا ازش برای ورود یا خوندن اطلاعات استفاده کنیم

mydb = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);

----------------------------------------------------------------------------------------

ساخت جدول در دیتابیس

خب حالا دیتابیس ما برای استفاده آماده ست ، الان نیاز به یک جدول با مشخصات مورد نظرمون برای ثبت اطلاعات داریم ( دیتابیس میتونه دارای چندین جدول باشه ، و هر جدول میتونه به ازای هر مشخصه یک ستون داشته باشه که باید نوع اون رو تعریف کنیم )
مثلا اگر شما میخواین اطلاعات یک دانش آموز رو ذخیره کنین ، ممکنه به این ترتیب جدول رو بسازید
ستون شماره دانش آموزی ، ستون نام ، نام خانوادگی ، معدل
هر جدول باید یک ستون داشته باشه که مقدار اون تکراری نباشه (primary key) ، اگر همچین مشخصه ای نداشتین میتونین یک ستون به اسم ID بسازید و بذارید که خود sqlite اون رو مقدار بده

mydb.execSQL("CREATE TABLE IF NOT EXISTS "+ TABLE +" (ID INTEGER PRIMARY KEY, NAME TEXT, PLACE TEXT);");

خب جدول ما درصورتی که وجود نداشته باشه ساخته میشه ( دقت کنید اول اسم ستون ، بعد نوع محتویات ستون مثلا AGE INTEGER )

اگر کارتون با دیتابیس تموم شد حتما اون رو با کد زیر ببندید

mydb.close();

-----------------------------------------------------------------------------------------------

وارد کردن اطلاعات در جدول ( از طریق کد )

حالا اگر خواستید اطلاعات رو وارد جدول کنید ، اگر دیتابیس بسته ست بعد از باز کردن اون از کد زیر استفاده میکنیم

mydb = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);
mydb.execSQL("INSERT INTO " + TABLE + "(NAME, PLACE) VALUES('یک دو سه','امتحان')");
mydb.close();

اینجا ما دو تا ستون NAME و PLACE رو مقدار دادیم ، و همونطور که دقت میکنید ID رو مقدار ندادیم تا خود Sqlite مقدار اون رو از یک هر دفعه اضافه کنه به صورت اتوماتیک ( اگر مقدار ستون primary key تکراری باشه خطا میگیرید )

کار با دستورات UPDATE و DELETE رو توی این پست (http://barnamenevis.org/showthread.php?441406-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-SQLite-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-%D8%A8%D8%AF%D9%88%D9%86-%D9%86%DB%8C%D8%A7%D8%B2-%D8%A8%D9%87-%DA%A9%D9%84%D8%A7%D8%B3-DataBaseHelper&p=1987835&viewfull=1#post1987835) میتونید مشاهده کنید

-------------------------------------------------------------------------------------------------------------------

خواندن اطلاعات از دیتابیس

حالا میخوایم اطلاعات رو از جدول بخونیم
برای این کار از یک شیء Cursor استفاده میکنیم که اطلاعات جدول رو داخل خودش نگه میداره
ابتدا باید قسمت های مورد نیاز از جدول رو داخل Cursor بریزیم

mydb = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);
Cursor allrows = mydb.rawQuery("SELECT * FROM "+ TABLE, null);

ما تو این کد با * تمام ستون های جدول رو به ترتیب داخل cursor ریختیم
در صورت نیاز میتونید فقط چند ستون رو انتخاب کنید تا کارتون راحت تر باشه
و میتونید ردیف هایی رو انتخاب کنید که یک شرط خاص رو داشته باشند ( مثلا دانشجویان با معدل بالای 16 )
اینا رو اگر نمیدونید یا برید دنبالش بگردید ، یا بپرسید براتون مثال بزنم ، چون به SQL ربط داره نه اندروید

خب حالا اطلاعات بدست اومده توی Cursor رو میشه به این ترتیب از اول تا آخر استفاده کرد
مثلا ما این اطلاعات رو داخل آرایه میذاریم، یا میشه اطلاعات رو توی textView نمایش داد ( این دست خود شماست )

فقط حواستون باشه اگر از آرایه استفاده کردید قبلش آرایه رو بر اساس تعداد سطرهای cursor دوباره سازی کنید، مثل کد زیر

NAME = new String[allrows.getCount()];

و ریختن اطلاعات توی آرایه :


int i = 0;
if(allrows.moveToFirst()){
do{
ID[i] = allrows.getInt(0);
NAME[i] = allrows.getString(1);
PLACE[i] = allrows.getString(2);
i++;
}
while(allrows.moveToNext());
}
allrows.close();
mydb.close();

بعد از خوندن اطلاعات از cursor هم باید حتما اون رو مثل دیتابیس بندید

اطلاعاتی رو که داخل آرایه ریختین میتونید به آداپتر لیست ویو یا گرید ویو بفرستید و در اونجا نمایش بدین

خب تبریک میگم شما یاد گرفتید خیلی ساده اطلاعات رو در دیتابیس ذخیره کنید و از دیتابیس بخونید
اگر نیاز به توضیح بود در خدمتم
دکمه تشکر هم که اون پایین هست دیگه :لبخند:

hamedjj
جمعه 25 بهمن 1392, 10:53 صبح
البته یه راه ساده هم برای کار با دیتابیس آماده هست که استفاده از لایبری sqlite asset helper است

https://github.com/jgilfelt/android-sqlite-asset-helper

poorman
جمعه 25 بهمن 1392, 12:43 عصر
حامد جان والا کلاس و لایبری که هست ، ولی فقط هست :لبخند:
میگم من هنوز نتونستم ارتباط خوبی برقرار کنم ، چون برام راحت نیست
بیشتر راحتم خودم چیزی که نیازم هست رو کد بنویسم ، بازم اگه این کلاس ها و لایبری ها یک آموزش استفاده خوب داشته باشه استقبال میکنیم ، نه اینکه لینک باشه :چشمک:

hamedjj
جمعه 25 بهمن 1392, 18:55 عصر
خوب اینقدر آسونه که فکر میکنم نیاز به آموزش نداشته باشه (البته در صفحه برنامه آموزش انگلیسیش هست)
فایل jar را تو پوشه libs برنامه کپی میکنید
بعد همانند اکتیویتی mydatabase نام تیبل و ستون ها را معرفی میکنید
همین

راستی من شنیدم برای آپدیت برنامه باید برنامه ورژن قبل که دیتابیس قبلی توش هست را پاک کرد و برنامه جدیدتر رانصب کرد تا دیتابیس تغییر کنه اما تو این لایبری اصلا نیاز نیست (تو مثال هاش هم مثال آپدیت دیتابیس وجود داره)

abbasalim
جمعه 25 بهمن 1392, 19:54 عصر
سلام
الان روش ساده ای که شما گفتین زیاد فرقی نداره ها فقط دسترسی بهش مشکل تر میشه همین:اشتباه:

poorman
جمعه 25 بهمن 1392, 20:19 عصر
سلام
الان روش ساده ای که شما گفتین زیاد فرقی نداره ها فقط دسترسی بهش مشکل تر میشه همین:اشتباه:

فرقش اینه که فهمش ساده تره
واسه کسایی که با دیتابیس آشنایی ندارن خوبه
حالا بعدش که آشنا شدن ، منم توصیه میکنم اصولی و مرتب از کلاس ها استفاده کنن :)

jafaripur
جمعه 25 بهمن 1392, 21:22 عصر
من نمی دونم شماها چرا خودتون رو به مشکل میندازین !
از کلاس SQLiteDatabase و Cursor استفاده کن و نیازی به این DBHelper ها نیست.

hamedjj
جمعه 25 بهمن 1392, 22:52 عصر
اهمیت استفاده از این لایبری اینه که لازم نیست برنامه قبلی را پاک کنیم که دیتابیس جدید تاثیر داشته باشه
خواسیتن sample های این برنامه را دانلود کنید

آیا این روش که همه میگن همین طوره یا برای ورژن جدید دیتابیس باید برنامه قبلی را پاک کنیم؟

poorman
دوشنبه 19 اسفند 1392, 15:42 عصر
آموزش کار با دیتابیس آماده SQLite

برای ساخت یک دیتابیس خارجی و آماده نرم افزار SQLite Database Browser (http://sourceforge.net/projects/sqlitebrowser/)رو پیشنهاد میکنم

نمونه کار با دیتابیس آماده و نمایش و آپدیت اطلاعات دیتابیس رو از این پست (http://barnamenevis.org/showthread.php?401729-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF&p=2016418&viewfull=1#post2016418)دریافت کنید

-----------------------------------------------------------------------------------------------

بالاخره من دیشب تونستم تمام مشکلات مربوط به دیتابیس آماده رو حل کنم و ارتباط خوبی برقرار کنم با لایبری
sqlite asset helper

( با تشکر از hamedjj به خاطر پافشاری روی استفاده از این لایبری )
ولی خب استفاده از این لایبری هم یکم برام گیج کننده بود که خدا رو شکر تونستم آخرش راه بندازمش
من یه توضیح میدم واسه کسایی که میخوان با دیتابیس آماده کار کنن و مثل من به مشکل خوردن

انصافا استفاده از sqlite asset helper راحته و بسیار کارا
یکی از مشکلاتی که من برخورد کردم توی استفاده از کلاس های دیگه، این بود که توی اندروید 10 به پایین دیتابیس رو ایجاد نمیکرد ولی این لایبری مشکل رو حل کرد

خب دوستانی که با اکلیپس کار میکنن این فایل jar رو دانلود کنن و توی پروژه مورد نظر در پوشه libs قرار بدن

(http://s3.picofile.com/file/8203393826/sqliteassethelper_2_0_1.jar.html)لینک فایل jar (http://s5.picofile.com/file/8156905342/sqliteassethelper_2_0_1.jar.html)

توی پوشهassets یک پوشه به اسم databases بسازید

بعد دیتابیس خودتون رو zip کنید ( فایل دیتابیس به تنهایی باید پسوند .db داشته باشه )

فایل زیپ شده رو با فرمت اسم ( DataBaseName.db.zip ) توی پوشه databases بذارید. ( دقت کنید باید هم پسوند db هم پسوند zip داشته باشه )

یعنی نمایش فایل زیپ توی ویندوز به صورت DataBaseName.db و نمایش توی اکلیپس به شکل DataBaseName.db.zip باشه

بعدش این کلاس رو ایجاد کنین





public class MyDatabase extends SQLiteAssetHelper {

private static final String DATABASE_NAME = "DataBaseName.db";
private static final int DATABASE_VERSION = 1;

public MyDatabase (Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
setForcedUpgrade();
}
}



توی کلاسی که ایجاد کردین اسم دیتابیس خودتون رو با پسوند db وارد کنین

بعدش توی اکتیویتی توی متغیرهای عمومی یک نمونه از این کلاس تعریف کنید، به این صورت :
private MyDatabase MyDataBase;

و بعد توی متد onCreate این خط کد رو بنویسین :
MyDataBase = new MyDatabase(this);

حالا هر جایی که خواستین دیتابیس رو باز کنین، میتونین از دو تا حالت getWritableDatabase() و getReadableDatabase() که برای خوندن و نوشتن هست استفاده کنین
به صورت زیر مثلا :

mydb = MyDataBase.getReadableDatabase();

وقتی getReadableDatabase استفاده میکنید، فقط عملیات خواندن رو میتونید انجام بدید

پس برای نوشتن یا آپدیت و دیلت باید از getWritableDatabase استفاده کنید

به همین سادگی، فقط باید تمام این مراحل رو به ترتیب و همینطور که گفتم انجام بدید که به مشکل نخورید
( zip کردن دیتابیس برای اینه که توی اندروید 10 به پایین خطا نگیرید )

آموزش کار با دیتابیس ( خواندن، نوشتن، آپدیت و دیلت ) توی همین تاپیک قرار داده شده

لطفا بعد از مطالعه درصورت وجود مشکل سوال بپرسید در خدمتم

----------------------------------------------------------------------------------------------

برای آپدیت کردن اطلاعات دیتابیس آماده به این پست (http://barnamenevis.org/showthread.php?441406-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-SQLite-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-%D8%A8%D8%AF%D9%88%D9%86-%D9%86%DB%8C%D8%A7%D8%B2-%D8%A8%D9%87-%DA%A9%D9%84%D8%A7%D8%B3-DataBaseHelper&p=1989704&viewfull=1#post1989704)مراجعه کنید

اگر مفید واقع شد، دکمه تشکر این پایینه :لبخند:

poorman
دوشنبه 19 اسفند 1392, 21:18 عصر
برای update و delete همون دستورات SQL استفاده میشه
به این صورت آپدیت میکنیم :

mydb.execSQL("update tableName set fieldName = 'value' where _id = 2");

با این دستور توی جدول tableName، مقدار ستون یا فیلد fieldName رو در جایی که id_ برابر 2 باشه، به value تغییر میدیم
اگه براش شرط نذارین مقدار fieldName تمام رکوردهاتون رو آپدیت میکنه
مثلا دستور زیر نمره همه دانشجوها رو 20 میکنه !!!

mydb.execSQL("update student set mark=20);

دستور delete هم به همین شکل عمل میکنه ، اگه شرط بذارین براش فقط رکوردهایی که اون شرط رو دارن پاک میکنه ، اگه شرط نذارین کل رکوردهای جدول رو پاک میکنه

mydb.execSQL("delete tableName where _id > 40);

mohsen22
دوشنبه 19 اسفند 1392, 21:39 عصر
تشکر فراوان و ممنون که تجربیاتتون رو در اختیار بقیه گذاشتید

hamedjj
دوشنبه 19 اسفند 1392, 22:53 عصر
دمت گرم poorman (http://barnamenevis.org/member.php?295320-poorman) جان که این موضوع را دنبال کردی و توضیحات کاملی برای هممون گذاشتی
من مزیت و راحتی این لایبری را تو همین تالار در چند تا تاپیک دیگه مطرح کردم اما این طور که مشخص بود کسی زیاد علاقه به استفاده از این لایبری را نداشت و از همان روش معمول استفاده میکردند.
واقعا دستت درد نکنه
..
میگم بیکار شدی یه پروژه آموزشی درباره این لایبری و آپدیت جدید بساز و در نمونه برنامه های کوچک اما مفید قرار بده که بقیه استفاده کنند.
یا اصلا همون sample های لایبری را با اضافه کردن چند تا کامنت فارسی در پروژه برای فهم بیشتر در تاپیک نمونه برنامه ها قرار بده
البته اگه حال داشتی و وقت داشتی
بازم دمت گرم

poorman
دوشنبه 19 اسفند 1392, 23:03 عصر
دمت گرم poorman (http://barnamenevis.org/member.php?295320-poorman) جان که این موضوع را دنبال کردی و توضیحات کاملی برای هممون گذاشتی
من مزیت و راحتی این لایبری را تو همین تالار در چند تا تاپیک دیگه مطرح کردم اما این طور که مشخص بود کسی زیاد علاقه به استفاده از این لایبری را نداشت و از همان روش معمول استفاده میکردند.
واقعا دستت درد نکنه
..
میگم بیکار شدی یه پروژه آموزشی درباره این لایبری و آپدیت جدید بساز و در نمونه برنامه های کوچک اما مفید قرار بده که بقیه استفاده کنند.
یا اصلا همون sample های لایبری را با اضافه کردن چند تا کامنت فارسی در پروژه برای فهم بیشتر در تاپیک نمونه برنامه ها قرار بده
البته اگه حال داشتی و وقت داشتی
بازم دمت گرم

خواهش میکنم ، دم تو گرم که انقد گفتی تا بالاخره من رفتم سراغش :قهقهه:
من کلا وقتی 2-3 روز دنبال یه چیزی بگردم و پیداش نکنم بعد آخرش راه حل رو که بفهمم انقد ذوق دارم که میام واسه بقیه هم آموزش میذارم :لبخند:

والا با آپدیت جدید که کار نکردم ولی فک نکنم چیز خاصی باشه ، توی همون کلاس MyDatabase کافیه DATABASE_VERSION رو یکی ببری بالا، اینطور که فهمیدم خودش بقیه کارا رو میکنه دیگه

keyvan_s89
پنج شنبه 22 اسفند 1392, 17:02 عصر
ببخشید من تازه واردم

mydb = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);
mydb.execSQL("INSERT INTO " + TABLE + "(NAME, PLACE) VALUES('یک دو سه','امتحان')");

mydb.close();





اگه بخوام به جای Value ثابت مقادیر رو از txtview بگیرم چه جوری میشه ؟

hojjjat
پنج شنبه 22 اسفند 1392, 19:58 عصر
سلام روش ویزادی موجود نیس؟
همانند برنامه ای دات نت؟؟

poorman
پنج شنبه 22 اسفند 1392, 22:26 عصر
ببخشید من تازه واردم

mydb = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);
mydb.execSQL("INSERT INTO " + TABLE + "(NAME, PLACE) VALUES('یک دو سه','امتحان')");

mydb.close();





اگه بخوام به جای Value ثابت مقادیر رو از txtview بگیرم چه جوری میشه ؟

سلام، برای وارد کردن اطلاعات از EditText میتونید به صورت زیر عمل کنید


String name = editTextName.getText().toString();
String place = editTextPlace.getText().toString();
mydb.execSQL("INSERT INTO " + TABLE + "(NAME, PLACE) VALUES ('" + name + "', '" + place + "')");

poorman
پنج شنبه 22 اسفند 1392, 22:29 عصر
سلام روش ویزادی موجود نیس؟
همانند برنامه ای دات نت؟؟

سلام، برای ساخت دیتابیس که خب نرم افزار هست
اما برای استفاده از دیتابیس همش برمیگرده به کد نویسی یا استفاده از کلاس ها و لایبری ها

keyvan_s89
جمعه 23 اسفند 1392, 00:21 صبح
سلام، برای وارد کردن اطلاعات از EditText میتونید به صورت زیر عمل کنید


String name = editTextName.getText().toString();
String place = editTextPlace.getText().toString();
mydb.execSQL("INSERT INTO " + TABLE + "(NAME, PLACE) VALUES ('" + name + "', '" + place + "')");


اپدیت و دلیت رو هم اگه یه مثال کوچولو بزنید ممنون میشم. و این که چه جوری اطلاعات خونده شده رو بریزیم تویه یه لیست ویو

hamidhtc
جمعه 23 اسفند 1392, 05:04 صبح
سلاممن تازه دارم اندرويد ياد ميگيرم ميخوام يه برنامه اندرويدي با کد نويسي بنويسم که جزوه درس انگليسمون است,مشکلي که دارم نميدونم چه جوري بايد متن اين جزورو وارد برنامه کنم لطفا کمک کنيد.

poorman
جمعه 23 اسفند 1392, 10:48 صبح
اپدیت و دلیت رو هم اگه یه مثال کوچولو بزنید ممنون میشم. و این که چه جوری اطلاعات خونده شده رو بریزیم تویه یه لیست ویو

برای آپدیت و دیلت کردن هم دقیقا کار به همین صورته دیگه، الگو برداری کنید راحته قضیه


String value = editTextValue.getText().toString();
int id = editTextID.getText();
mydb.execSQL("update tableName set fieldName = '" + value + "' where _id = " + id);


برای ریختن اطلاعات توی لیست ویو هم وقتی اطلاعات رو ریختید توی آرایه، بعدش آرایه ها رو میفرستید به آداپتر لیست ویو و نمایش میدید که آموزش این مبحث دیگه به موضوع تاپیک مربوط نیست

poorman
جمعه 23 اسفند 1392, 10:54 صبح
سلاممن تازه دارم اندرويد ياد ميگيرم ميخوام يه برنامه اندرويدي با کد نويسي بنويسم که جزوه درس انگليسمون است,مشکلي که دارم نميدونم چه جوري بايد متن اين جزورو وارد برنامه کنم لطفا کمک کنيد.

شما اول یک شناخت کلی از دیتابیس SQLite پیدا کنین که چطوری اطلاعات دسته بندی میشه و میشه اونها رو خوند
بعدش برای اینکه بعدا بتونین بهترین استفاده رو از دیتابیس کنین، برای اطلاعاتتون یک چارچوب مشخص تعیین کنین و بعدش اونا رو از طریق نرم افزار SQLite Browser وارد دیتابیس خودتون کنین
مثلا اگه میخواین لغات رو ترجمه کنین، یک جدول به اسم dictionary بسازید و چند تا ستون id_ و word و meaning رو بسازید و اطلاعاتتون رو از طریق دستورهای SQL وارد دیتابیس کنید

بعد که دیتابیستون آماده شد، میاین توی این تاپیک و آموزش مربوط به استفاده از دیتابیس آماده و کار با دیتابیس رو میخونین

keyvan_s89
جمعه 23 اسفند 1392, 12:45 عصر
مشکلم حل شد

poorman
جمعه 23 اسفند 1392, 15:00 عصر
میگم بیکار شدی یه پروژه آموزشی درباره این لایبری و آپدیت جدید بساز و در نمونه برنامه های کوچک اما مفید قرار بده که بقیه استفاده کنند.
یا اصلا همون sample های لایبری را با اضافه کردن چند تا کامنت فارسی در پروژه برای فهم بیشتر در تاپیک نمونه برنامه ها قرار بده


حامد جان من رفتم بحث آپدیت رو خوندم ، آپدیت توی این لایبری دو تا حالت داره
یکی اینکه میخواین اطلاعاتی که کاربر وارد دیتابیس کرده از دست نره و برای اینکار باید یکسری مراحل رو طی کرد تا اطلاعات قبلی توی دیتابیس جدید وارد بشه
این کار رو من امتحان نکردم ، و اطلاع زیادی هم ندارم ولی اینجا (https://github.com/jgilfelt/android-sqlite-asset-helper#database-upgrades) توضیح داده

مورد بعدی اینه که شما براتون مهم نیست کاربر اطلاعات قبلیش چی بوده، یا اصلا کاربر با دیتابیس کاری نداشته و چیزی توش وارد نکرده
که برای اینکار کافیه عدد ورژن دیتابیس رو توی کلاس MyDatabase یکی ببرید بالا و توی همون کلاس توی تابع MyDatabase بعد از متد super این کد رو بنویسید
setForcedUpgrade();

اینطوری به صورت خودکار دیتابیس قبلی پاک میشه و دیتابیس جدید جایگزین میشه

البته کاملا معلومه که فایل دیتابیس موجود در پوشه assets/databases هم باید با فایل جدید جایگزین بشه ( با همون نام قبلی )

ho3ein.3ven
یک شنبه 25 اسفند 1392, 13:46 عصر
جناب poorman واقعا ممنون خیلی بدردم خورد
یه سوال داشتم . چطوری مشیه count رو بدست آورد ؟ چون آرایه ها باید به صورت پویا تعریف بشه دیگه.

poorman
یک شنبه 25 اسفند 1392, 23:30 عصر
جناب poorman واقعا ممنون خیلی بدردم خورد
یه سوال داشتم . چطوری مشیه count رو بدست آورد ؟ چون آرایه ها باید به صورت پویا تعریف بشه دیگه.

درسته چون باید آرایه ها رو پویا مقدار بدید می تونید از تابع getCount استفاده کنید برای Cursor

int num = yourCursor.getCount();

ho3ein.3ven
دوشنبه 26 اسفند 1392, 16:50 عصر
خیلی ممنون بابت جوابتون.
ببخشید باز مزاحم شدم .
تو این روشی که گفتین کپی کردن دیتابیس آماده به چه صورتی هست ؟ اگه ممکنه یکم توضیح بدین .

poorman
سه شنبه 27 اسفند 1392, 00:28 صبح
خواهش میکنم، کپی کردن منظورتون چیه ؟ فایل دیتابیس رو زیپ میکنید با همون مراحلی که گفتم بعدش فایل رو میکشید و توی پوشه assets/databases ول میکنید

بعدش برای اینکه دیتابیس شناخته بشه باید از لایبری SQLite asset helper استفاده کنین به ترتیبی که گفته شد

poorman
دوشنبه 04 فروردین 1393, 17:02 عصر
سلام دوستان

من میخواستم دیتابیس دو تا از برنامه هام رو با هم ترکیب کنم، مسلما زمان زیادی میبرد تا بخوام یکی یکی جدول ها رو توی دیتابیس جدید ایجاد کنم و باز دوباره اطلاعات رو وارد کنم

توی اینترنت گشتم اما راهی که به درد بخوره پیدا نکردم
آخر سر یه راهکار اتفاقی یا ابتکاری پیدا کردم و مشکلم رو حل کردم که گفتم اینجا بگم شاید به درد کسی دیگه هم بخوره

مواد مورد نیاز :لبخند: : SQLite Database Browser , Microsoft SQL Server

نکته : اگه Microsoft SQL Server روی سیستمتون نصب نیست به نظر من بیخیال بشین :بامزه: چون حجمش 4 گیگ میشه تقریبا

ابتدا دیتابیسی رو که میخواین به دیتابیس اصلی اضافه کنین با نرم افزار SQLite Browser باز میکنید
بعدش از منوی file گزینه export رو انتخاب میکنید و بعد Database to SQL file
حالا فایل رو درجای دلخواه با پسوند .sql ذخیره کنید

بعدش برید جایی که فایل رو ذخیره کردید و اون رو با Microsoft SQL Server باز کنید
می بینید که یک سری کوئری و دستورات SQL براتون اورد
حالا تمام اطلاعات در اختیار شماست و میتونید با SQLite Browser دیتابیس اصلی رو باز کنید و این کوئری ها و دستورات رو اونجا کپی کنید و بعد execute کنید ( از قسمت Execute SQL )

حتی جدول رو هم نمیخواد بسازید و دستور ساخت جدول توی همون کوئری ها وجود داره
اطلاعات رو که وارد کردید، بعدش میتونید با ابزارهای SQLite Browser هر بلا و تغییری که خواستید سرشون در بیارید

امیدوارم توضیحاتم کامل و مفید باشه :لبخندساده:

jafaripur
دوشنبه 04 فروردین 1393, 17:55 عصر
سلام دوستان

من میخواستم دیتابیس دو تا از برنامه هام رو با هم ترکیب کنم، مسلما زمان زیادی میبرد تا بخوام یکی یکی جدول ها رو توی دیتابیس جدید ایجاد کنم و باز دوباره اطلاعات رو وارد کنم

توی اینترنت گشتم اما راهی که به درد بخوره پیدا نکردم
آخر سر یه راهکار اتفاقی یا ابتکاری پیدا کردم و مشکلم رو حل کردم که گفتم اینجا بگم شاید به درد کسی دیگه هم بخوره

مواد مورد نیاز:لبخند: : SQLite Database Browser , Microsoft SQL Server

نکته : اگه Microsoft SQL Server روی سیستمتون نصب نیست به نظر من بیخیال بشین :بامزه: چون حجمش 4 گیگ میشه تقریبا

ابتدا دیتابیسی رو که میخواین به دیتابیس اصلی اضافه کنین با نرم افزار SQLite Browser باز میکنید
بعدش از منوی file گزینه export رو انتخاب میکنید و بعد Database to SQL file
حالا فایل رو درجای دلخواه با پسوند .sql ذخیره کنید

بعدش برید جایی که فایل رو ذخیره کردید و اون رو با Microsoft SQL Server باز کنید
می بینید که یک سری کوئری و دستورات SQL براتون اورد
حالا تمام اطلاعات در اختیار شماست و میتونید با SQLite Browser دیتابیس اصلی رو باز کنید و این کوئری ها و دستورات رو اونجا کپی کنید و بعد execute کنید ( از قسمت Execute SQL )

حتی جدول رو هم نمیخواد بسازید و دستور ساخت جدول توی همون کوئری ها وجود داره
اطلاعات رو که وارد کردید، بعدش میتونید با ابزارهای SQLite Browser هر بلا و تغییری که خواستید سرشون در بیارید

امیدوارم توضیحاتم کامل و مفید باشه :لبخندساده:

چرا لقمه رو می پیچونی می زاری دهنت ؟ :لبخند:
تو SQLite با همچین چیزی می تونی این کار رو بکنی.
یک کپی از Structure جدول اولی بنویس و بعد query زیر رو بزن
INSERT INTO test1(`id`,`name`) SELECT `id`,`name` FROM test

مثلا با Navicat می تونی کپی و پیست هم بکنی.

poorman
دوشنبه 04 فروردین 1393, 18:26 عصر
الان یا من منظور رو متوجه نشدم یا شما منظور منو :لبخند:

چون دو تا دیتابیس رو نمیشه همزمان توی SQLite باز کرد و مسلما نمیشه اطلاعات رو به همین راحتی با یک کوئری منتقل کرد

الان اینکه میگی یک کپی از stucture جدول اول بگیرم یعنی چی ؟؟؟ چطوری اینکارو بکنم ؟

jafaripur
دوشنبه 04 فروردین 1393, 23:26 عصر
الان یا من منظور رو متوجه نشدم یا شما منظور منو :لبخند:

چون دو تا دیتابیس رو نمیشه همزمان توی SQLite باز کرد و مسلما نمیشه اطلاعات رو به همین راحتی با یک کوئری منتقل کرد

الان اینکه میگی یک کپی از stucture جدول اول بگیرم یعنی چی ؟؟؟ چطوری اینکارو بکنم ؟

دو تا دیتابیس که سهل هستش، هر چند تا که بخوای می تونی باز کنی فرض کن 10 تا.
گرفتن Strcuture هم همون گرفتن dump از table هستش یا همون export.

ali-star
چهارشنبه 27 فروردین 1393, 05:42 صبح
سلام دوستان

بعد از آپدیت نرم افزار به خوبی نصب میشه یعنی ارور نمیده؟؟؟ چون تو بعضی جاها گفتن استفاده از دیتابیس آماده باعث میشه تو آپدیت نرم افزار با ارور مواجه میشین...

poorman
چهارشنبه 27 فروردین 1393, 14:55 عصر
آپدیت دو تا حالت داره یکی اینکه دیتابیس بخواد پاک بشه و نسخه جدید جایگزین شه، یکی اینکه اطلاعات جدید به دیتابیس قبلی اضافه بشه

مورد اول رو که من تست کردم هیچ مشکلی پیش نمیاد، مورد دوم والا هنوز امتحان نکردم، ولی با توجه به قدرتی که لایبری SQL asset helper داره فک نمیکنم اگر همه کارها رو درست انجام بدید مشکلی پیش بیاد

saeed_g21
چهارشنبه 27 فروردین 1393, 20:20 عصر
آپدیت دو تا حالت داره یکی اینکه دیتابیس بخواد پاک بشه و نسخه جدید جایگزین شه، یکی اینکه اطلاعات جدید به دیتابیس قبلی اضافه بشه

مورد اول رو که من تست کردم هیچ مشکلی پیش نمیاد، مورد دوم والا هنوز امتحان نکردم، ولی با توجه به قدرتی که لایبری SQL asset helper داره فک نمیکنم اگر همه کارها رو درست انجام بدید مشکلی پیش بیاد
کافیه واسه دیتابیس نسخه تعریف کنی بعد اگه تغییراتی در اطلاعات داخلی دیتابیس داشته باشه نسخه جدید دیتابیس رو 1+قبلی کنی بعد با دستورات مثل alter table و ... مدیریت کنی
من به اینصورت استفاده می کنم خیلی هم راحته و جواب میشه البته بایستی به دستورات SQL اشنایی خوبی داشته باشید اینطوری حتی اطلاعات قبلی هم حذف نمیشه

akbar_online
پنج شنبه 11 اردیبهشت 1393, 13:07 عصر
من این مراحل انجام دادم فقط نمی دونم از کوئری select چجوری استفاده کنم یعنی مثلا textview برابر فیلد مورد نظر از بانک شود

akbar_online
پنج شنبه 11 اردیبهشت 1393, 13:31 عصر
بالاخره من دیشب تونستم تمام مشکلات مربوط به دیتابیس آماده رو حل کنم و ارتباط خوبی برقرار کنم با لایبری
sqlite asset helper ( با تشکر از hamedjj به خاطر پافشاری روی استفاده از این لایبری )

ولی خب استفاده از این لایبری هم یکم برام گیج کننده بود که خدا رو شکر تونستم آخرش راه بندازمش
من یه توضیح میدم واسه کسایی که میخوان با دیتابیس آماده کار کنن و مثل من به مشکل خوردن

انصافا استفاده از sqlite asset helper راحته و بسیار کارا
یکی از مشکلاتی که من برخورد کردم توی استفاده از کلاس های دیگه، این بود که توی اندروید 10 به پایین دیتابیس رو ایجاد نمیکرد ولی این لایبری مشکل رو حل کرد

خب دوستانی که با اکلیپس کار میکنن این فایل jar رو دانلود کنن و توی پروژه مورد نظر در پوشه libs قرار بدن

http://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=com.readystatesoftware.sqliteasset&a=sqliteassethelper&v=LATEST&&c=jar


توی پوشه assets یک پوشه به اسم databases بسازید
بعد دیتابیس خودتون رو zip کنید و با این فرمت ( DataBaseName.db.zip ) توی پوشه databases بذارید ( دقت کنید باید هم پسوند db هم پسوند zip داشته باشه )

بعدش این کلاس رو ایجاد کنین




public class MyDatabase extends SQLiteAssetHelper {

private static final String DATABASE_NAME = "DataBaseName.db";
private static final int DATABASE_VERSION = 1;

public MyDatabase (Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
}



توی کلاسی که ایجاد کردین اسم دیتابیس خودتون رو با پسوند db وارد کنین

بعدش توی اکتیویتی توی متغیرهای عمومی یک نمونه از این کلاس تعریف کنید، به این صورت :
private MyDatabase MyDataBase;

و بعد توی متد onCreate این خط کد رو بنویسین :
MyDataBase = new MyDatabase(this);

حالا هر جایی که خواستین دیتابیس رو باز کنین، میتونین از دو تا حالت getWritableDatabase() و getReadableDatabase() که برای خوندن و نوشتن هست استفاده کنین
به صورت زیر مثلا :

mydb = MyDataBase.getReadableDatabase();

به همین سادگی، فقط باید تمام این مراحل رو به ترتیب و همینطور که گفتم انجام بدید که به مشکل نخورید
( zip کردن دیتابیس برای اینه که توی اندروید 10 به پایین خطا نگیرید )

اگر مفید واقع شد، دکمه تشکر این پایینه :لبخند:


من این مراحل انجام دادم فقط نمی دونم از کوئری select چجوری استفاده کنم یعنی مثلا textview برابر فیلد مورد نظر از بانک شود

hamedjj
پنج شنبه 11 اردیبهشت 1393, 21:42 عصر
من از لایبری sqlite asset helper استفاده میکنم که تو table خودم یه ستون به نام favorite دارم برای لیست علاقه مندی ها
مقادیر این table همه no هستند که میخوام باید با کلیک رو دکمه افزودن به yes تبدیل شود

برای اجرای این عمل باید چیکار کنم؟؟

davoodi
جمعه 12 اردیبهشت 1393, 12:35 عصر
سلام.
وقتی که از
mydb = MyDatabase.getReadableDatabase();
در کدهام استفاده میکنم برنامه موقع اجرا خطا میده.
میتونید کمکم کنید؟

ali-star
جمعه 12 اردیبهشت 1393, 19:34 عصر
من هم وقتی اجرا می کنم میگه نمیتونه دیتابیس رو بخونه....

مشکل حل شد یادم رفت پوشه databases رو بسازم...:لبخند:

---------------------------------------------------------------------------------------

دوستان حالا ما یکه دیتابیس داریم خوب...
- چطوری میتونیم اطلاعات رو از دیتابیس بگیریم؟:متفکر:

hamedjj
جمعه 12 اردیبهشت 1393, 19:52 عصر
سلام.
وقتی که از
mydb = MyDatabase.getReadableDatabase();
در کدهام استفاده میکنم برنامه موقع اجرا خطا میده.
میتونید کمکم کنید؟

دیتابیس را باید تو پوشه databases و سپس تو پوشه asset قرار بدی
شما این کار را کردید؟

کسی نیست سوال منو جواب بده؟؟؟

davoodi
جمعه 12 اردیبهشت 1393, 19:54 عصر
دیتابیس را باید تو پوشه databases و سپس تو پوشه asset قرار بدی
شما این کار را کردید؟

کسی نیست سوال منو جواب بده؟؟؟


من کاملا مطابق با آموزش پیش رفتم.
اما کار نمیکنه!!!

poorman
جمعه 12 اردیبهشت 1393, 22:00 عصر
من این مراحل انجام دادم فقط نمی دونم از کوئری select چجوری استفاده کنم یعنی مثلا textview برابر فیلد مورد نظر از بانک شود

شما به پست اول مراجعه کنید
اونجا قشنگ کار با دیتابیس و کوئری select توضیح داده شده

از cursor استفاده میکنید و اطلاعات رو داخلش میریزید و بعد هر قسمتی که خواستید رو میتونید به عنوان text بذارید یا توی آرایه یا هر چیز دیگه

poorman
جمعه 12 اردیبهشت 1393, 22:04 عصر
من از لایبری sqlite asset helper استفاده میکنم که تو table خودم یه ستون به نام favorite دارم برای لیست علاقه مندی ها
مقادیر این table همه no هستند که میخوام باید با کلیک رو دکمه افزودن به yes تبدیل شود

برای اجرای این عمل باید چیکار کنم؟؟

حامد جان ببخشید من نبودم

برای این کار شما دیتابیس رو باید از نوع writable بگیرید به جای readable و بقیه کار مشابه قبل هست
یعنی شما با کد mydb.execsql میتونید هر کوئری رو روی دیتابیس اعمال کنی ( چون دیتابیس رو از نوع نوشتنی گرفتید، فقط کارهای نوشتنی )

mydb = MyDataBase.getWritableDatabase();
mydb.execSQL("update table set column = 'yes' where id = 1");

poorman
جمعه 12 اردیبهشت 1393, 22:09 عصر
سلام.
وقتی که از
mydb = MyDatabase.getReadableDatabase();
در کدهام استفاده میکنم برنامه موقع اجرا خطا میده.
میتونید کمکم کنید؟

سلام

چند تا احتمال وجود داره، یکی اینکه شما دارید یک عمل اجرایی انجام میدین درحالی که دیتابیستون رو از نوع readable گرفتید، پس اگر میخواین کاری روی دیتابیس اجرا بشه باید writable باشه

احتمال دیگه اینکه شما قبل از مقدار دادن متغیر mydb تون MyDatabase رو مقدار ندادین ( MyDataBase = new MyDatabase(context); )

احتمالات دیگه هم میشه در نظر گرفت ولی باید پیام خطایی که میده رو بذارید، شاید کلا کوئری شما مشکل داره

poorman
جمعه 12 اردیبهشت 1393, 22:11 عصر
من هم وقتی اجرا می کنم میگه نمیتونه دیتابیس رو بخونه....

مشکل حل شد یامدم رفت پوشه databases رو بسازم...:لبخند:

---------------------------------------------------------------------------------------

دوستان حالا ما یکه دیتابیس داریم خوب...
- چطوری میتونیم اطلاعات رو از دیتابیس بگیریم؟:متفکر:

اطلاعات رو با cursor از دیتابیس بخونید

توی پست اول نمونه کار با دیتابیس و کوئری select و insert وجود داره، توی پست های بعدی هم update و delete

ali-star
جمعه 12 اردیبهشت 1393, 22:12 عصر
دوستان چطوری میتونیم اطلاعات رو از دیتابیس بگیریم؟
میشه یه مثال بزارید؟

poorman
جمعه 12 اردیبهشت 1393, 22:15 عصر
دوستان چطوری میتونیم اطلاعات رو از دیتابیس بگیریم؟
میشه یه مثال بزارید؟

من داشتم به ترتیب جواب سوالات رو میدادم :لبخند: شما یکم عجله کردی

جوابتون توی پست قبل هستش

saeed_g21
جمعه 12 اردیبهشت 1393, 22:17 عصر
اگه دیتابیس بسته است باید باز کنید بعد با استفاده از دستور زیر

Cursor cursor= db.rawQuery("select name from db", null);
cursor.moveToFirst();
String txt= cursor.getString(cursor.getColumnIndex("name"));

hamedjj
جمعه 12 اردیبهشت 1393, 23:03 عصر
دوستان چطوری میتونیم اطلاعات رو از دیتابیس بگیریم؟
میشه یه مثال بزارید؟

تو نمونه برنامه ها یه پروژه آموزشی هست که از این لایبری استفاده شده

http://barnamenevis.org/showthread.php?401729-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF&p=1977385&viewfull=1#post1977385

ali-star
شنبه 13 اردیبهشت 1393, 00:08 صبح
کافیه واسه دیتابیس نسخه تعریف کنی بعد اگه تغییراتی در اطلاعات داخلی دیتابیس داشته باشه نسخه جدید دیتابیس رو 1+قبلی کنی بعد با دستورات مثل alter table و ... مدیریت کنی
من به اینصورت استفاده می کنم خیلی هم راحته و جواب میشه البته بایستی به دستورات SQL اشنایی خوبی داشته باشید اینطوری حتی اطلاعات قبلی هم حذف نمیشه

میشه کد بزارید؟

------------------------------------------------------------------------

با توضیح زیر مشکل حل شد.

مورد بعدی اینه که شما براتون مهم نیست کاربر اطلاعات قبلیش چی بوده، یا اصلا کاربر با دیتابیس کاری نداشته و چیزی توش وارد نکرده
که برای اینکار کافیه عدد ورژن دیتابیس رو توی کلاس MyDatabase یکی ببرید بالا و توی همون کلاس توی تابع MyDatabase بعد از متد super این کد رو بنویسید

setForcedUpgrade();

اینطوری به صورت خودکار دیتابیس قبلی پاک میشه و دیتابیس جدید جایگزین میشه

------------------------------------------------------------------------

دوستان کسی نمیدونه در این روش چگونه اطلاعات رو به صورت راندوم از دیتابیس بگیریم؟
مثلا من 5 تا داده دارم و میخوام با با کلیک بر روی دکمه یکی از این داده ها توی یک TextView نمایش داده بشه.:متفکر:

poorman
شنبه 13 اردیبهشت 1393, 12:58 عصر
دوستان کسی نمیدونه در این روش چگونه اطلاعات رو به صورت راندوم از دیتابیس بگیریم؟
مثلا من 5 تا داده دارم و میخوام با با کلیک بر روی دکمه یکی از این داده ها توی یک TextView نمایش داده بشه.:متفکر:

این رندوم گرفتن اطلاعات دیگه از سمت دیتابیس نیست
شما باید 5 تا داده رو با cursor بگیرید ( select ) کنید و از دستور رندوم استفاده کنید و با تولید یک عدد بین صفر و تعداد رکوردها، اون داده رندوم رو برگردونید


Cursor c = your select query ...
Random r = new Random();
int x = r.nextInt(c.getCount());
c.moveToPosition(x);
textview.setText(c.getString(c.getColumnIndex("name")));

davoodi
شنبه 13 اردیبهشت 1393, 20:18 عصر
سلام

چند تا احتمال وجود داره، یکی اینکه شما دارید یک عمل اجرایی انجام میدین درحالی که دیتابیستون رو از نوع readable گرفتید، پس اگر میخواین کاری روی دیتابیس اجرا بشه باید writable باشه

احتمال دیگه اینکه شما قبل از مقدار دادن متغیر mydb تون MyDatabase رو مقدار ندادین ( MyDataBase = new MyDatabase(context); )

احتمالات دیگه هم میشه در نظر گرفت ولی باید پیام خطایی که میده رو بذارید، شاید کلا کوئری شما مشکل داره


سلام. کل کدی که من نوشتم این هست :


private MyDatabase MyData;
private SQLiteDatabase mydb;


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

MyData = new MyDatabase(this);

mydb = MyData.getWritableDatabase();


}




ضمن اینکه دیتابیس رو در فولدری assets و در پوشه databases قرار داده ام. با نام test.db.zip

این هم کلاس MyDatabse هست :


public class MyDatabase extends SQLiteAssetHelper{

private static final String DATABASE_NAME = "test.db";
private static final int DATABASE_VERSION = 1;

public MyDatabase (Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}



}


اما اروری که میده اینه :
unfortunately, mydbs has stopped

ممنونم.

poorman
شنبه 13 اردیبهشت 1393, 20:29 عصر
دوست عزیز لطفا log خطا رو بذارید تا بتونم راهنمایی کنم

saeed_g21
شنبه 13 اردیبهشت 1393, 21:17 عصر
دوست عزيز نام فايلت test.db.zip هست چطوري ميخواي فايل test.db رو باز کني ؟
نام فايلت رو به test.db تغيير نام بده بعد دوباره تست بزن

poorman
شنبه 13 اردیبهشت 1393, 21:34 عصر
دوست عزيز نام فايلت test.db.zip هست چطوري ميخواي فايل test.db رو باز کني ؟
نام فايلت رو به test.db تغيير نام بده بعد دوباره تست بزن

نه اسم فایل باید همینطور باشه، چون دیتابیس باید به صورت zip در بیاد

davoodi
شنبه 13 اردیبهشت 1393, 22:36 عصر
نه اسم فایل باید همینطور باشه، چون دیتابیس باید به صورت zip در بیاد

اما اسم فایل رو که تغییر دادم کار کرد!!!!!
من هم از همین تعجب کردم. شما فرمودید که نباید اسم تغییر کنه اما ...

poorman
شنبه 13 اردیبهشت 1393, 22:41 عصر
اما اسم فایل رو که تغییر دادم کار کرد!!!!!
من هم از همین تعجب کردم. شما فرمودید که نباید اسم تغییر کنه اما ...

احتمالا شما بعد از اینکه zip کردید دوباره یک .zip هم اضافه کردین :لبخند:

منظور من از داشتن .zip همون پسوند فایل zip بود که نباید حذف بشه و باید باشه ( یعنی نمایش اسم توی ویندوز test.db هست اما نمایش توی اکلیپس test.db.zip )

davoodi
شنبه 13 اردیبهشت 1393, 22:52 عصر
احتمالا شما بعد از اینکه zip کردید دوباره یک .zip هم اضافه کردین :لبخند:

منظور من از داشتن .zip همون پسوند فایل zip بود که نباید حذف بشه و باید باشه ( یعنی نمایش اسم توی ویندوز test.db هست اما نمایش توی اکلیپس test.db.zip )

ظاهرا اینطوری بوده :لبخند:.
ممنون از راهنماییتون.
شما انسان بزرگواری هستید که به این سادگی اطلاعاتتون رو در اختیار همگان قرار میدید.:تشویق:
موفق باشید.

ali-star
یک شنبه 14 اردیبهشت 1393, 04:17 صبح
سلام دوستان

چطوری میتونیم همزمان از همه تیبل ها اطلاعات رو بگیریم.

مثلا من دیتابیسم 5 تا تیبل داره و میخوام همه اطلاعات او 5 تیبل توی listView نمایش داده بشه؟

davoodi
یک شنبه 14 اردیبهشت 1393, 08:44 صبح
سلام دوستان
چطوری میتونیم همزمان از همه تیبل ها اطلاعات رو بگیریم.
مثلا من دیتابیسم 5 تا تیبل داره و میخوام همه اطلاعات او 5 تیبل توی listView نمایش داده بشه؟

اینکه چطوری توی لیست ویو نشون بدیم رو نمیدونم چون من تازه واردم اما همونطوری که استاد عزیز گفتن برای گرفتن اطلاعات از دیتابیس باید از دستورات زیر استفاده کنید :




mydb= MyData.getReadableDatabase();
Cursor cursor= mydb.rawQuery("select * from db", null);
cursor.moveToFirst();
String txt= cursor.getString(cursor.getColumnIndex("name"));



موفق باشید.

nadia poorakbar
یک شنبه 14 اردیبهشت 1393, 10:18 صبح
باسلام وخسته نباشین
( من مبتدی هستم)از مطلب مفیدتون واقعا متشکرم چون من چندماه است که با این مشکل روبرو هستم وتا حدی مشکل حل شد حالا من در برنامه ام از جستجو استفاده کرده ام به این شکل که صفحه ای را کاربر باز میکند که دارای چند فیلد است با توجه به فیلدهایی که کاربر پر میکند و دیتابیس برنامه باید کار جستجو را اغاز کند وسپس نتیجه کار را به کاربر در صفحه دیگر نمایش دهد حال برای این کار چه طوری باید با این دیتابیس کار کنم؟

poorman
یک شنبه 14 اردیبهشت 1393, 10:27 صبح
سلام دوستان

چطوری میتونیم همزمان از همه تیبل ها اطلاعات رو بگیریم.

مثلا من دیتابیسم 5 تا تیبل داره و میخوام همه اطلاعات او 5 تیبل توی listView نمایش داده بشه؟

شما در هر زمان میتونید اطلاعات یک تیبل رو بخونید، یعنی نمیشه با یک کوئری 5 تا تیبل رو بگیرید

برای کاری که شما میخواین، باید اطلاعات هر تیبل رو یکی یکی بگیرید و توی آرایه یا لیست بریزید و اون رو به لیست آداپتر بفرستید

یعنی یک بار برای تیبل اول کوئری مینویسید و اطلاعاتش رو داخل آرایه میریزید، بعد باز برای هر تیبل این عملیات رو تکرار میکنین

poorman
یک شنبه 14 اردیبهشت 1393, 11:22 صبح
باسلام وخسته نباشین
( من مبتدی هستم)از مطلب مفیدتون واقعا متشکرم چون من چندماه است که با این مشکل روبرو هستم وتا حدی مشکل حل شد حالا من در برنامه ام از جستجو استفاده کرده ام به این شکل که صفحه ای را کاربر باز میکند که دارای چند فیلد است با توجه به فیلدهایی که کاربر پر میکند و دیتابیس برنامه باید کار جستجو را اغاز کند وسپس نتیجه کار را به کاربر در صفحه دیگر نمایش دهد حال برای این کار چه طوری باید با این دیتابیس کار کنم؟

سلام
شما برای جستجو مسلما باید از کوئری select استفاده کنید اما باید براش شرط بذارید

مثلا بگید سطری رو select کن که فیلد اسم اون برابر "حجت" باشه

شرط رو با where مینویسیم

select name,family,tell from Table where name = 'حجت'

این کوئری رو دقیقا مثل کوئری های دیگه استفاده میکنید، هیچ فرقی ندارن

شما ارتباط با دیتابیس رو یاد گرفتین، دیگه از اینجا به بعد همه چیز به SQL برمیگرده، یعنی شما اگه میخواین بهترین عملکرد رو توی دیتابیس داشته باشین، باید دستورات SQL رو یاد بگیرید

nadia poorakbar
یک شنبه 14 اردیبهشت 1393, 12:18 عصر
باتشکر از جواب شما فقط ببخشید اگر بجای حجت بخواهیم فیلدی که کاربر وارد کرده را قرار بدهیم ارتباطی به دیتابیس نداره (در صورت امکان یک نمونه ارایه دهید)

poorman
یک شنبه 14 اردیبهشت 1393, 12:26 عصر
باتشکر از جواب شما فقط ببخشید اگر بجای حجت بخواهیم فیلدی که کاربر وارد کرده را قرار بدهیم ارتباطی به دیتابیس نداره (در صورت امکان یک نمونه ارایه دهید)

چشم ایشالا تا فردا من یک نمونه جستجو در دیتابیس میذارم

davoodi
یک شنبه 14 اردیبهشت 1393, 12:35 عصر
سلام.
استاد لطفا برای کار با SQLite یک نرم افزار خوب و روان معرفی کنید.
من بصورت دستی فایل ها رو آماده میکردم اما نمیدونم چرا از دیتابیسم داره ایراد میگیره همش.
ممنونم.

ali-star
یک شنبه 14 اردیبهشت 1393, 12:56 عصر
افزونه SQLite Manager برای FireFox میتونه بهترین گزینه باشه.

poorman
یک شنبه 14 اردیبهشت 1393, 13:00 عصر
هم افزونه ای که دوستمون معرفی کردن، هم نرم افزار SQLite Database browser کار رو با دیتابیس آسون میکنه

البته وارد کردن اطلاعات به هرحال به صورت دستی هست ( به صورت کوئری یا اینکه از توی جدول ها )، مگر اینکه تبدیل دیتابیس آماده باشه

davoodi
یک شنبه 14 اردیبهشت 1393, 13:01 عصر
افزونه SQLite Manager برای FireFox میتونه بهترین گزینه باشه.

من با همین افزونه هم دیتابیس ساختم.
بعد پسوندش رو به .db تغییر دادم.
بعد هم زیپش کردم.
اما وارد پوشه databases که میکنم برنامه پیام خطا میده و بسته میشه.
میشه راهنمایی کنید که کجای کارم اشتباه است ؟

ali-star
یک شنبه 14 اردیبهشت 1393, 14:04 عصر
من فشردش نکرم مستقیم اضافه کردم اون هم با پسوند sqlite کار کرد.

ali-star
یک شنبه 14 اردیبهشت 1393, 14:29 عصر
شما در هر زمان میتونید اطلاعات یک تیبل رو بخونید، یعنی نمیشه با یک کوئری 5 تا تیبل رو بگیرید

برای کاری که شما میخواین، باید اطلاعات هر تیبل رو یکی یکی بگیرید و توی آرایه یا لیست بریزید و اون رو به لیست آداپتر بفرستید

یعنی یک بار برای تیبل اول کوئری مینویسید و اطلاعاتش رو داخل آرایه میریزید، بعد باز برای هر تیبل این عملیات رو تکرار میکنین

میشه با کد توضیح بدید؟

davoodi
یک شنبه 14 اردیبهشت 1393, 17:40 عصر
دوستان لطفا منو راهنمایی کنید.
من با استفاده از برنامه SQLite Studio دیتابیس مورد نظرم رو درست کردم.
و خروجی .sql هم گرفتم.
الان برای اینکه بتونم ازش در اندروید استفاده کنم باید چطوری پسوندش رو به .db تغییر بدم ؟
پسوند .sqlite هم نمیدونم چرا اما یه وقتایی کار میکنه یه وفتایی هم اصلا جواب نمیده و برنامه ارور میدهو

ممنونم.

poorman
دوشنبه 15 اردیبهشت 1393, 00:13 صبح
میشه با کد توضیح بدید؟

توضیح خیلی واضحه که دیگه !!!

یک بار میگید cursor = mydb.rawQuery("select * from table1"); و اطلاعات رو ازش میخونید و توی آرایه میریزید

بعدش باز دوباره میگید cursor = mydb.rawQuery("select * from table2"); و اطلاعات رو به آرایه اضافه میکنید

و به همین ترتیب برای بقیه تیبل ها ...

شرمنده چون من وقت ندارم یک نمونه کامل بذارم، شما لطف کنید طبق همون اصول کار با دیتابیس که توی پست اول همین تاپیک گفتم کار کنید

poorman
دوشنبه 15 اردیبهشت 1393, 00:19 صبح
دوستان لطفا منو راهنمایی کنید.
من با استفاده از برنامه SQLite Studio دیتابیس مورد نظرم رو درست کردم.
و خروجی .sql هم گرفتم.
الان برای اینکه بتونم ازش در اندروید استفاده کنم باید چطوری پسوندش رو به .db تغییر بدم ؟
پسوند .sqlite هم نمیدونم چرا اما یه وقتایی کار میکنه یه وفتایی هم اصلا جواب نمیده و برنامه ارور میدهو

ممنونم.

شما اگر میخواین با لایبری که آموزشش رو قرار دادم کار کنید باید دیتابیس با پسوند db ذخیره بشه و بعد زیپ بشه

من پیشنهاد میکنم از نرم افزار SQLite Database Browser استفاده کنید، توی این نرم افزار بعد از ساخت به راحتی دیتابیس رو ذخیره میکنید

لازم نیست خروجی بگیرید، فقط ذخیره کنید با پسوند .db

اگر هم فایلتون پسوند نداره خودتون یک .db بهش اضافه کنید

sara_traveler
دوشنبه 15 اردیبهشت 1393, 08:40 صبح
زمانی که در SQLite Database Browser دیتابیس مثلا در درایو c ایجاد کردیم
حالا در برنامه اندروید چطور این مسیر بدیم؟


private static String DBNAME = "PERSONS";


یا زمانی که برنامه در تبلت ریختیم این دیتابیس از کجا میخواد بخونه؟

ali-star
دوشنبه 15 اردیبهشت 1393, 09:37 صبح
زمانی که در SQLite Database Browser دیتابیس مثلا در درایو c ایجاد کردیم
حالا در برنامه اندروید چطور این مسیر بدیم؟


private static String DBNAME = "PERSONS";

یا زمانی که برنامه در تبلت ریختیم این دیتابیس از کجا میخواد بخونه؟


دوست عزیز دیتابیس باید در مسیر assets/databases قرار داده بشه و نه در هارد کامپیوتر اینطوری که نمیشه دیتابیس رو خوند.

sara_traveler
دوشنبه 15 اردیبهشت 1393, 12:13 عصر
ّله درسته
همین دیتابیس با Sqlite maneger درست کنم درسته؟
اما پسوند .db نیست
.sqlite درست میکنه

و نمیدونم این دیتابیس چطور درست کنم؟

poorman
دوشنبه 15 اردیبهشت 1393, 13:50 عصر
من الان این بالا تمام مراحل رو توضیح دادم دیگه، چرا اینقدر خودتون رو می پیچونید !!! :لبخند:

پسوند توی فایل های دیتابیس SQLite مهم نیست، شما اون رو تغییر بدید به .db

اگر به هر دلیلی نشد طبق روشی که میگم عمل کنید، من با نرم افزار SQLite Database Browser کار کردم فقط، خیلی هم راحته و کم حجم

تو این نرم افزار دیتابیس رو بسازید و ذخیره کنید با پسوند .db ( پسوند رو خودتون باید اضافه کنید )

بعدش فایل دیتابیس رو زیپ میکنید و طبق آموزش کار با دیتابیس آماده پیش میرید

( من تنها میتونم توی زمینه ای که تجربه دارم راهنمایی کنم، برای همین نرم افزارهای دیگه و پسوندهایی که میدن رو توصیه نمیکنم )

sara_traveler
دوشنبه 15 اردیبهشت 1393, 13:59 عصر
میشه لینک دانلود

SQLite Database Browser
بگذارید؟

poorman
دوشنبه 15 اردیبهشت 1393, 14:28 عصر
از این لینک دانلود کنید

http://sourceforge.net/projects/sqlitebrowser/

sara_traveler
دوشنبه 15 اردیبهشت 1393, 14:48 عصر
ممنون
درست کردم و زمانی که فایل zip میکردم خطا میداد
بعد با حالت معمولی گذاشتم درست شد

اما حالا بعد ریختن اطلاعات از طریق برنامه میخوام با sqlitebrowser (http://sourceforge.net/projects/sqlitebrowser/) محتویات ببینم
الان که محتویاتش نگاه میکنم میبینم اطلاعاتی درونش درج نشده

باید چیکار کنم؟

poorman
دوشنبه 15 اردیبهشت 1393, 15:06 عصر
بعد از اینکه دیتابیس رو ساختید حتما باید ذخیره کنید تا اطلاعات داخلش ثبت بشه

دیتابیس رو که ذخیره کردید، اگر بعدا خواستید اطلاعات رو ببینید یا تغییر بدید open database میزنید و فایل دیتابیس رو انتخاب میکنید تا دیتابیس باز بشه

sara_traveler
دوشنبه 15 اردیبهشت 1393, 15:09 عصر
من دیتابیس با این برنامه ساختم
بعد در پوشه و مسیرهایی که شما گفتین کپی کردم
و از طریق برنامه اندروید داخلش اطلاعات ذخیره کردم

حالا میخوام همون اطلاعات از طریقsqlitebrowser (http://sourceforge.net/projects/sqlitebrowser/) ببینم

الان کلاسی که گفتین گذاشتم این کدها قرار دادم

SQLiteDatabase mydb; MyDataBase = new MyDatabase(this);
mydb = MyDataBase.getWritableDatabase();



mydb.execSQL("insert into ramz (name,pass) values ('3','3' ) ");

poorman
دوشنبه 15 اردیبهشت 1393, 15:52 عصر
آها شما میخواین بعد از انجام تغییرات توی برنامه دیتابیس رو ببینید

برای این کار باید برید به همون DDMS و پوشه دیتا و باز دیتا و بعد پوشه برنامه تون

توی اون تاپیک دیگه گفتید که اونجا نتونستید پیدا کنید، در حالت عادی باید همین جا باشه، مگر اینکه جا به جا کرده باشید ( جای دیگه اش رو اطلاع ندارم الان )

بالاخره فایل دیتابیس برنامه رو باید از طریق همون DDMS بگردید و پیدا کنید، بعد از اینکه پیدا کردید فایل رو انتخاب میکنید، یک آیکون اون بالا هست شبیه save که با اون فایل دیتابیس رو توی کامپیوتر ذخیره میکنید و با نرم افزار بازش میکنید

davoodi
دوشنبه 15 اردیبهشت 1393, 18:08 عصر
سلام استاد.
چطور میتونم اطلاعات رو از دیتابیس با do و while بگیرم؟
میخوام اطلاعات رو بریزیم توی یک arrayAdapter بعد به یک لیست ویو لینکش کنم.
میشه راهنمایی کنید ؟

poorman
دوشنبه 15 اردیبهشت 1393, 18:52 عصر
سلام استاد.
چطور میتونم اطلاعات رو از دیتابیس با do و while بگیرم؟
میخوام اطلاعات رو بریزیم توی یک arrayAdapter بعد به یک لیست ویو لینکش کنم.
میشه راهنمایی کنید ؟

سلام

بابا به خدا من دانشجوام :لبخند: انقد نگو استاد

این کاری که شما میخواین انجام بدید آموزشش توی پست اول همین تاپیک وجود داره

همچنین این نمونه برنامه (http://barnamenevis.org/showthread.php?401729-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF&p=2016418&viewfull=1#post2016418)که گذاشتم میتونه کمکتون کنه توی این کار

باز هم من سعی میکنم یک پروژه کامل واسه کار با دیتابیس تا آخر این هفته بذارم

hamedjj
سه شنبه 16 اردیبهشت 1393, 16:06 عصر
poorman (http://barnamenevis.org/member.php?295320-poorman) جان تو پروژه افزودن به علاقه مندی ها یه اشکال هست که نتونستم برطرف کنم
اگر داده ها زیاد باشه و اولیین ستاره را لمس کنی و روشن بشه مقدار برابر با yes میشه اما اگه یه اسکرول به پایین کنی و دوباره بالا بیای ستاره خود به خود خاموش میشه (اما مقدار هنوز yes هست)

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

http://upir.ir/1393.2/listdata.gif

poorman
سه شنبه 16 اردیبهشت 1393, 16:44 عصر
همونجا که داده ها رو توی دیتابیس آپدیت میکنیم ، آرایه رو هم تغییر بده

یعنی :

likes[position] = "yes";

hamedjj
چهارشنبه 17 اردیبهشت 1393, 02:04 صبح
اون مشکلی که در بالا گفتم خود تو پروژه شما که از arrayadapter اکستندز شده با کدی که در بالا گذاشتید برطرف میشه.
ولی تو کلاسی که از CursorAdapter گرفته شده اینطور نیست .. منم هر کاریش کردم نتونستم اینو درست کنم
کد کلاس را در زیر قرار میدم
فکر کنم باید me را مانند likes[position] مساوی yes یا no قرار بدم که باز هم نمیشه

public class MyAdapter extends CursorAdapter {

Context b;
LayoutInflater inflater;
@SuppressWarnings("deprecation")
public MyAdapter(Context context, Cursor c) {
super(context, c);
inflater = LayoutInflater.from(context);
b= (Context) context;
}

@SuppressWarnings("unused")
@Override
public void bindView(View view, Context context, final Cursor cursor) {
// TODO Auto-generated method stub

TextView tv1 = (TextView)view.findViewById(R.id.txt_name);
TextView tv2 = (TextView)view.findViewById(R.id.txt_numer);

tv1.setText(cursor.getString(2));
tv2.setText(cursor.getString(3));

final int pos = cursor.getPosition();

final Button favorite_check= (Button)view.findViewById(R.id.favorite_check);
final CheckBox repeatChkBx = (CheckBox)view.findViewById(R.id.favorite_check);

String me = cursor.getString(cursor.getColumnIndex("like"));

if (me.equals("yes")) {
repeatChkBx.setChecked(true);
} else {
repeatChkBx.setChecked(false);
}

repeatChkBx.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View view) {
MyDatabase MyDatabase = new MyDatabase(b);
SQLiteDatabase mydb = MyDatabase.getWritableDatabase();
cursor.moveToPosition(pos);

if (repeatChkBx.isChecked()) {
mydb.execSQL("update list set like = 'yes' where id = " + cursor.getString(1));

}else{
mydb.execSQL("update list set like = 'no' where id = " + cursor.getString(1));

}
}
});

}

protected Context getActivity() {
// TODO Auto-generated method stub
return null;
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return inflater.inflate(R.layout.item, parent, false);
}
}

poorman
چهارشنبه 17 اردیبهشت 1393, 02:21 صبح
حامد جان چیزی که من پیدا کردم اینه که نمیشه اطلاعات cursor رو مستقیما تغییر داد

شما باید بعد از اینکه دیتابیس رو آپدیت کردی cursor رو requery() کنی ( دیگه تاثیرش روی سرعت رو نمیدونم )

ولی حالا چه اصراری که از CursorAdapter استفاده کنی ؟ مگه آرایه چه مشکلی داره ؟ دست آدم بازتره برای کار با لیست ویو

hamedjj
چهارشنبه 17 اردیبهشت 1393, 02:38 صبح
آره راست میگی بهتره از آرایه استفاده کرد
من دارم برای آموزش و یادگیری این پروژه ها را انجام میدم
با آرایه که خوب پروژه شما هست
می خواستم بدونم با cursorAdapter چطور میشه انجام داد
بازم دمت گرم که جواب سوال هام را دادی

شاید یه تاپیک زدم ببینم بچه ها چی میگن

poorman
چهارشنبه 17 اردیبهشت 1393, 02:53 صبح
البته منم قبل اینکه این پروژه رو بهم بدی اصلا نمیدونستم با cursor میشه آداپتر رو ساخت :لبخند:

و به نظرم راه جالبی اومد برای افزایش سرعت

یک راه حل به ذهنم رسید، بیا علاوه بر cursor که میفرستی، آرایه likes رو هم بفرست، اینطوری هم سرعت کم نمیشه هم کار درست میشه

hamedjj
چهارشنبه 17 اردیبهشت 1393, 03:15 صبح
یعنی چطوری این کارو بکنیم؟ :متفکر:

poorman
چهارشنبه 17 اردیبهشت 1393, 03:47 صبح
کاری نداره که دیگه

توی آداپتر مقادیر ورودی رو علاوه بر cursor یک آرایه هم بگیر ( که همون آرایه لایک هست و قبلا باید پر بشه )


Context b;
String likes[];
LayoutInflater inflater;
@SuppressWarnings("deprecation")
public MyAdapter(Context context, Cursor c, String likes[]) {
super(context, c);
inflater = LayoutInflater.from(context);
b= (Context) context;
this.likes = likes;
}


این قسمت باید اینطوری تغییر کنه

بعدش هم خواستی چک باکس رو مقدار بدی از cursor مقدار نده، از این آرایه مقدار بده

sara_traveler
چهارشنبه 17 اردیبهشت 1393, 07:58 صبح
الان curser مثل datatable در سی شارپ عمل میکنه؟

چطر میتونیم یک کلاس بنویسیم که اطلاعات در کرسر بریزه و به صورت استاتیک به بقیه صفحات پاس بدیم
یعنی میخوام برای همه پروزه فقط یک کلاس نوشته بشه هر بار همون فراخونی بشه و فقط دستور اسکیول به عنوان ورودی داده بشه و خروجی اون هم بصورت استاتیک به هر فرمی خواستیم داده بشه

poorman
چهارشنبه 17 اردیبهشت 1393, 11:18 صبح
من C# کار نکردم ( VB.NET ) کار کردم، اما فک میکنم آره مثل همون دیتا تیبل باشه

اینکه شما یک کلاس برای پاس دادن cursor بنویسید کار خاصی نداره!!! شما وقتی یک متغیر cursor پابلیک داشته باشی، از تمام اکتیویتی ها و کلاس های دیگه میتونی بهش دسترسی داشته باشی

شما بر فرض توی اکتیویتی اول این cursor عمومی رو مقدار بدین، بعد توی اکتیویتی های دیگه اطلاعاتش رو بخونین

ولی در کل به نظر من این کار لازم نیست، مگر اینکه شما فقط یک یا دو کوئری داشته باشید

چون اگر هر بار بخواین اطلاعات دیتابیس رو توی cursor نگه دارید، فضای زیادی مصرف میشه و چون پابلیک هست این فضا آزاد نمیشه

sara_traveler
چهارشنبه 17 اردیبهشت 1393, 12:19 عصر
بله فضای زیادی اشغال میکنه
اما دستوری نیست که بعد استفاده از کرسر خالیش کنیم تا فضا ازاد بشه؟


چون به نظر من جالب نیست ما در هر فرمی این تابع بنویسیم فراخونی کنیم اگر در یک کلاس باشه و یکبار نوشته بشه خیلی بهتره

نظرتون چیه؟

davoodi
چهارشنبه 17 اردیبهشت 1393, 12:26 عصر
سلام استاد :لبخندساده:.
من باید توی پروژه از join استفاده میکنم.
فارین کی ها رو با sqlitestudio-2.1.5 در دیتابیسم ساختم.
اما به محض اینکه از دستور inner join استفاده میکنم برنامه خطا میده.
این هم کدهام هستن :


Cursor row = mydb.rawQuery("SELECT table2.* FROM table1 "
+ "INNER JOIN table2 ON table1.a = table2.b", null);


ممنونم.

davoodi
چهارشنبه 17 اردیبهشت 1393, 13:03 عصر
سلام استاد :لبخندساده:.
من باید توی پروژه از join استفاده میکنم.
فارین کی ها رو با sqlitestudio-2.1.5 در دیتابیسم ساختم.
اما به محض اینکه از دستور inner join استفاده میکنم برنامه خطا میده.
این هم کدهام هستن :


Cursor row = mydb.rawQuery("SELECT table2.* FROM table1 "
+ "INNER JOIN table2 ON table1.a = table2.b", null);


ممنونم.


مشکل بخاطر رعایت نکردن فاصله ها در کوئری بود که حل شد.
ممنون.

poorman
چهارشنبه 17 اردیبهشت 1393, 13:10 عصر
بله فضای زیادی اشغال میکنه
اما دستوری نیست که بعد استفاده از کرسر خالیش کنیم تا فضا ازاد بشه؟


چون به نظر من جالب نیست ما در هر فرمی این تابع بنویسیم فراخونی کنیم اگر در یک کلاس باشه و یکبار نوشته بشه خیلی بهتره

نظرتون چیه؟

ببینید کار شما دو تا حالت داره، یکی اینکه کلا دو تا کوئری دارید و روند خواندن اطلاعات از cursor توی تمام صفحات یکسان هست

تو این حالت حرف شما عملی میشه، شما یک تابع پابلیک میذارید و بعد از فراخوانی اطلاعات رو برمیگردونید ( دست خودتونه از چه نوع باشه )

حالت دیگه اینه که کوئری های شما شکل یکسان نداره
توی این حالت تنها میشه کوئری فرستاد و cursor رو دریافت کرد، که تاثیری توی خلاصه سازی نداره به نظر من !!!

hamedjj
چهارشنبه 17 اردیبهشت 1393, 17:24 عصر
کاری نداره که دیگه

توی آداپتر مقادیر ورودی رو علاوه بر cursor یک آرایه هم بگیر ( که همون آرایه لایک هست و قبلا باید پر بشه )


Context b;
String likes[];
LayoutInflater inflater;
@SuppressWarnings("deprecation")
public MyAdapter(Context context, Cursor c, String likes[]) {
super(context, c);
inflater = LayoutInflater.from(context);
b= (Context) context;
this.likes = likes;
}


این قسمت باید اینطوری تغییر کنه

بعدش هم خواستی چک باکس رو مقدار بدی از cursor مقدار نده، از این آرایه مقدار بده

خوب اینجوری از همون آرایه بریم کارش راحت تره که

poorman
چهارشنبه 17 اردیبهشت 1393, 18:02 عصر
دیگه چیزی که من توی بساطم داشتم همین بود :لبخند:

حالا بازم سرچ بزن اگه راه دیگه ای پیدا شد که جواب بده ما رو بی خبر نذار :لبخندساده:

ali-star
چهارشنبه 17 اردیبهشت 1393, 22:01 عصر
آقای poorman راست میگن اما اگه میشه وقتی به راه حلی رسیدین یه سورس بزارید تا همه استفاده کنند.
من هم از این روش استفاده میکنم و به مشکل برخوردم.

f.asadkhani
دوشنبه 22 اردیبهشت 1393, 16:31 عصر
باسلام
این برنامه خطادر بازکردن بانک میذه من تو چه مسیری دنبال بانک باشم؟؟؟




public class myDB {
//SQLite database
private SQLiteDatabase moDB;
private final static String CONST_DB_PATH="/SMART-BUS";
private final static String CONST_DB_NAME="/Database.db3";

private String mstrCurDBPath;

protected void onDestroy()
{
CloseDatabase();

}

public SQLiteDatabase GetDB()
{
return moDB;
}

public void CloseDatabase()
{
if(moDB!=null)
{
if (moDB.isOpen())
{
moDB.close();
}

}
}

public String GetDBPath()
{
//String strDBPath ;
//strDBPath= android.os.Environment
// .getExternalStorageDirectory().getAbsolutePath()
// + CONST_DB_PATH+CONST_DB_NAME;

//strDBPath = android.os.Environment.getExternalStorageDirectory ().getAbsolutePath()
// + CONST_DB_PATH+CONST_DB_NAME;

return mstrCurDBPath;
}

public SQLiteDatabase OpenDatabase()
{
String strDBPath,strRoot ;
File oDir;
try
{
moDB=null;

strDBPath = android.os.Environment.getExternalStorageDirectory ().getAbsolutePath()
+ CONST_DB_PATH+CONST_DB_NAME;


oDir = new File(strDBPath);
if (oDir.exists()==false)
{
strDBPath="/sdcard"+CONST_DB_PATH+CONST_DB_NAME;
oDir = new File(strDBPath);
if (oDir.exists()==false)
{
strDBPath ="/flash"+CONST_DB_PATH+CONST_DB_NAME;
oDir = new File(strDBPath);
if (oDir.exists()==false)
{
strDBPath = "/mnt/sdcard" + CONST_DB_PATH+CONST_DB_NAME;
oDir = new File(strDBPath);
if (oDir.exists()==false)
{
strDBPath = "/LocalDisk" + CONST_DB_PATH+CONST_DB_NAME;
if (oDir.exists()==false)
{
strDBPath = "/local" + CONST_DB_PATH+CONST_DB_NAME;
}
}
}
}


}


mstrCurDBPath=strDBPath;
moDB = SQLiteDatabase.openOrCreateDatabase(strDBPath, null);

}catch (Exception e)
{

}
return moDB;
}

poorman
دوشنبه 22 اردیبهشت 1393, 20:09 عصر
کدتون خیلی قاطی پاتیه !!! بهتر بود کدهاتون رو توی تگ جاوا بذارید تا بشه راحت خوند

خطایی رو هم که میده بذارید شاید کمک کنه توی فهمیدن مشکلتون

f.asadkhani
پنج شنبه 25 اردیبهشت 1393, 11:44 صبح
سلام ،
کلا کلاسوفرستادم،من نمیدونم کجا باید دنبال فایل دیتابیسم بگردم یا دستی کجا بزارمش؟؟؟
درزمان اجرا در DDMS دیتابیسمو پیدا نمیکنه در مسیر لوکال در داخل کد...
strDBPath = "/local" + CONST_DB_PATH+CONST_DB_NAME

مشکل سرهمین مسیره من نمیدونم این از کدوم روشی که شما گفتین استفاده کرده......


package com.smartbus.automation.database;


import java.io.File;


import android.content.Context;

import android.content.ContextWrapper;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.widget.Toast;


 

public class myDB {

//SQLite database

private SQLiteDatabase moDB;

private final static String CONST_DB_PATH="/SMART-BUS";

private final static String CONST_DB_NAME="/Database.db3";



private String mstrCurDBPath;



protected void onDestroy()

{

CloseDatabase();



}



public SQLiteDatabase GetDB()

{

return moDB;

}



public void CloseDatabase()

{

if(moDB!=null)

{

if (moDB.isOpen())

{

moDB.close();

}



}

}



public String GetDBPath()

{

//String strDBPath ;

//strDBPath= android.os.Environment

// .getExternalStorageDirectory().getAbsolutePath()

// + CONST_DB_PATH+CONST_DB_NAME;



//strDBPath = android.os.Environment.getExternalStorageDirectory ().getAbsolutePath()

// + CONST_DB_PATH+CONST_DB_NAME;



return mstrCurDBPath;

}



public SQLiteDatabase OpenDatabase()

{

String strDBPath,strRoot ;

File oDir;

try

{

moDB=null;



strDBPath = android.os.Environment.getExternalStorageDirectory ().getAbsolutePath()

+ CONST_DB_PATH+CONST_DB_NAME;





oDir = new File(strDBPath);

if (oDir.exists()==false)

{

strDBPath="/sdcard"+CONST_DB_PATH+CONST_DB_NAME;

oDir = new File(strDBPath);

if (oDir.exists()==false)

{

strDBPath ="/flash"+CONST_DB_PATH+CONST_DB_NAME;

oDir = new File(strDBPath);

if (oDir.exists()==false)

{

strDBPath = "/mnt/sdcard" + CONST_DB_PATH+CONST_DB_NAME;

oDir = new File(strDBPath);

if (oDir.exists()==false)

{

strDBPath = "/LocalDisk" + CONST_DB_PATH+CONST_DB_NAME;

if (oDir.exists()==false)

{

strDBPath = "/local" + CONST_DB_PATH+CONST_DB_NAME;

}

}

}

}





}


mstrCurDBPath=strDBPath;

moDB = SQLiteDatabase.openOrCreateDatabase(strDBPath, null);



}catch (Exception e)

{



}

return moDB;

}




 

/*

* execute SQL

*/

public boolean ExecSQL(SQLiteDatabase DB,String strSql)

{

boolean blnFlag = false;

try

{

DB.execSQL(strSql);

blnFlag = true;

}

catch(Exception e)

{



}

return blnFlag;

}



/*

* Query SQL

*/

public Cursor GetCursor(SQLiteDatabase DB,String strTableName,String[] arraystrColsName,String strWhere,

String[] arraystrReplacementChar,String strGroupBy,String strHaving,String strOderby)

{

Cursor ocursor=null;

try

{

ocursor = DB.query(strTableName, arraystrColsName,

strWhere, arraystrReplacementChar, strGroupBy, strHaving, strOderby);









}

catch(Exception e)

{



}

return ocursor;

}



}

poorman
جمعه 26 اردیبهشت 1393, 01:09 صبح
الان این کد شما در زمان اجرا میاد تمام مسیرهایی که ممکن هست دیتابیس اونجا باشه رو چک میکنه، اگر دیتابیس رو پیدا کنه، برمیگردونه

اگر دیتابیس رو پیدا نکنه خودش توی مسیر local میسازه دیتابیستون رو

شما که میگی پیدا نمیکنه، چون دیتابیس رو قبلا نساختی یا توی اون مسیر کپی نکردی

اگر دیتابیستون آماده ست، از لایبری SQLite Asset Helper استفاده کنید که آموزشش توی همین تاپیک هست

اگر میخواین دیتابیس رو خودتون توی برنامه بسازید، با همین کلاس خب دیتابیس رو میسازه، اما مسیرش رو طوری تنظیم کنین که اگر آخرین شرط ( یعنی local ) هم برقرار نبود، بره توی پوشه data/data/package/database بسازه مثلا

f.asadkhani
شنبه 27 اردیبهشت 1393, 08:22 صبح
مرسی که بررسی کردین،من دیتابیسم آماده هس الان طبق این برنامه کجا برم بزارمش؟؟که بر نامه بتونه پیداش کنه من از این مسیرش سردرنمیارم....من یه پوشه درس کردم و اسمشو smart-bus گداشتم و داخلش دیتابیسمو کپی کردم بازم نشد......
local و localdisk یعنی کجا؟؟
من دقیقا درمسیری که پوشه res و src و... هسن یه پوشه درس کردم و اسمشو smart-bus گداشتم و داخلش دیتابیسمو کپی کردم. و توی یکی از اون شرطایی که میره میگرده گفتم توی اون مسر بگرده اما بازم نشد ببینید بدای دسترسی بع اون پوشه که درریشه هس اینجوری اشتباهه که بازم پیداش نمیکنه....

if (oDir.exists()==false)

{

strDBPath = CONST_DB_PATH+CONST_DB_NAME;

oDir = new File(strDBPath);



SQLite Asset Helper که آموزش دادین رو دیدم شماخوب توضیح داده بودید اما من زیاد بااندروید و کار با دیتابیس تازه واردم نمیتونم تمام توابع این کلاسو که برای یه برنامه بزرگه با این SQLite Asset Helper دوباره بنویسم.آخه این کلاسو که بقیه ازش استفاده میکنن فقط برای اجرای دستورات sql یه تابع داره شما گفته بودین خونون و نوشتن فرق میکنه...

poorman
شنبه 27 اردیبهشت 1393, 15:10 عصر
ببینین شما دیتابیس آماده دارید، برای دیتابیس آماده خدایی من یک هفته هرچی روش توی اینترنت پیدا کردم رو امتحان کردم، هیچی ساده تر و بی اشکال تر از لایبری SQLite Asset Helper نبود

این کدهایی که نوشتید برای کار با دیتابیسی هست که توسط خود برنامه بسازید، این دیتابیس ساخته شده توی گوشی و در آدرسهایی که توی کدتون هست میتونه ذخیره بشه

اگر شما میخواین از این کدها برای دیتابیس آمادتون استفاده کنین، باید یک تابع بنویسید که اگر دیتابیستون توی این مسیرها نبود، دیتابیستون رو از توی پوشه asset کپی کنه توی این مسیرها ( که داخل گوشی هست )

ولی بازهم راحت ترین و بهترین کار استفاده از همون لایبری هست که آموزشش رو گذاشتم، لازم نیست تمام توابع رو دوباره نویسی کنید!!!

خوندن و نوشتن و تمام کارهای دیتابیس به همون صورت قبلی هست، تنها تفاوت توی مقدار دادن دیتابیس هست، شما همین رو تغییر بدید دیگه نیازی به تغییر بقیه جاها نیست که

f.asadkhani
شنبه 27 اردیبهشت 1393, 16:20 عصر
اوکی بازم تشکر که جواب دادین،تلاشمو میکنم ببینم چی میشه...

antimat
شنبه 27 اردیبهشت 1393, 17:00 عصر
برنامه من واسه cursor.getInt خطا میگیره چیکار کنم؟؟

poorman
شنبه 27 اردیبهشت 1393, 18:21 عصر
برنامه من واسه cursor.getInt خطا میگیره چیکار کنم؟؟

لطفا کدتون و خطایی رو که میده بذارید، من اینطوری غیب گویی که نمیتونم بکنم

شاید اون داده ای که میخواین بگیرید از نوع int نیست یا توی ایندکس دادن دارید اشتباه میکنید

Pam.goudarzi
شنبه 27 اردیبهشت 1393, 18:36 عصر
آموزش کار با دیتابیس آماده SQLite

برای ساخت یک دیتابیس خارجی و آماده نرم افزار SQLite Database Browser (http://sourceforge.net/projects/sqlitebrowser/)رو پیشنهاد میکنم

نمونه کار با دیتابیس آماده و نمایش و آپدیت اطلاعات دیتابیس رو از این پست (http://barnamenevis.org/showthread.php?401729-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF&p=2016418&viewfull=1#post2016418)دریافت کنید

-----------------------------------------------------------------------------------------------

بالاخره من دیشب تونستم تمام مشکلات مربوط به دیتابیس آماده رو حل کنم و ارتباط خوبی برقرار کنم با لایبری
sqlite asset helper

( با تشکر از hamedjj به خاطر پافشاری روی استفاده از این لایبری )
ولی خب استفاده از این لایبری هم یکم برام گیج کننده بود که خدا رو شکر تونستم آخرش راه بندازمش
من یه توضیح میدم واسه کسایی که میخوان با دیتابیس آماده کار کنن و مثل من به مشکل خوردن

انصافا استفاده از sqlite asset helper راحته و بسیار کارا
یکی از مشکلاتی که من برخورد کردم توی استفاده از کلاس های دیگه، این بود که توی اندروید 10 به پایین دیتابیس رو ایجاد نمیکرد ولی این لایبری مشکل رو حل کرد

خب دوستانی که با اکلیپس کار میکنن این فایل jar رو دانلود کنن و توی پروژه مورد نظر در پوشه libs قرار بدن

لینک فایل jar (http://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=com.readystatesoftware.sqliteasset&a=sqliteassethelper&v=LATEST&&c=jar)

توی پوشهassets یک پوشه به اسم databases بسازید

بعد دیتابیس خودتون رو zip کنید ( فایل دیتابیس به تنهایی باید پسوند .db داشته باشه )

فایل زیپ شده رو با فرمت اسم ( DataBaseName.db.zip ) توی پوشه databases بذارید. ( دقت کنید باید هم پسوند db هم پسوند zip داشته باشه )

یعنی نمایش فایل زیپ توی ویندوز به صورت DataBaseName.db و نمایش توی اکلیپس به شکل DataBaseName.db.zip باشه

بعدش این کلاس رو ایجاد کنین




public class MyDatabase extends SQLiteAssetHelper {

private static final String DATABASE_NAME = "DataBaseName.db";
private static final int DATABASE_VERSION = 1;

public MyDatabase (Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
}



توی کلاسی که ایجاد کردین اسم دیتابیس خودتون رو با پسوند db وارد کنین

بعدش توی اکتیویتی توی متغیرهای عمومی یک نمونه از این کلاس تعریف کنید، به این صورت :
private MyDatabase MyDataBase;

و بعد توی متد onCreate این خط کد رو بنویسین :
MyDataBase = new MyDatabase(this);

حالا هر جایی که خواستین دیتابیس رو باز کنین، میتونین از دو تا حالت getWritableDatabase() و getReadableDatabase() که برای خوندن و نوشتن هست استفاده کنین
به صورت زیر مثلا :

mydb = MyDataBase.getReadableDatabase();

وقتی getReadableDatabase استفاده میکنید، فقط عملیات خواندن رو میتونید انجام بدید

پس برای نوشتن یا آپدیت و دیلت باید از getWritableDatabase استفاده کنید

به همین سادگی، فقط باید تمام این مراحل رو به ترتیب و همینطور که گفتم انجام بدید که به مشکل نخورید
( zip کردن دیتابیس برای اینه که توی اندروید 10 به پایین خطا نگیرید )

آموزش کار با دیتابیس ( خواندن، نوشتن، آپدیت و دیلت ) توی همین تاپیک قرار داده شده

لطفا بعد از مطالعه درصورت وجود مشکل سوال بپرسید در خدمتم

----------------------------------------------------------------------------------------------

برای آپدیت کردن اطلاعات دیتابیس آماده به این پست (http://barnamenevis.org/showthread.php?441406-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-SQLite-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-%D8%A8%D8%AF%D9%88%D9%86-%D9%86%DB%8C%D8%A7%D8%B2-%D8%A8%D9%87-%DA%A9%D9%84%D8%A7%D8%B3-DataBaseHelper&p=1989704&viewfull=1#post1989704)مراجعه کنید

اگر مفید واقع شد، دکمه تشکر این پایینه :لبخند:

ممنون از آموزشتون، نسبت به اون چیزایه دیگه ای که دیدم خیلی ساده تر به نظر می رسه،
وقتی کد ها رو می نویسم به Sqlite assethelper گیر میده، فک کنم باید کلاسش ساخته بشه، و اگه باید ساخته بشه سوپرکلسش باید چی باشه؟
خیلی ممنون

poorman
شنبه 27 اردیبهشت 1393, 19:07 عصر
ممنون از آموزشتون، نسبت به اون چیزایه دیگه ای که دیدم خیلی ساده تر به نظر می رسه،
وقتی کد ها رو می نویسم به Sqlite assethelper گیر میده، فک کنم باید کلاسش ساخته بشه، و اگه باید ساخته بشه سوپرکلسش باید چی باشه؟
خیلی ممنون

خواهش میکنم، باید لایبری SQLite Asset Helper رو توی پوشه libs بریزید

تا کلاس از اون لایبری extend بشه

Pam.goudarzi
شنبه 27 اردیبهشت 1393, 21:50 عصر
توی کلاسی که ایجاد کردین اسم دیتابیس خودتون رو با پسوند db وارد کنین

بعدش توی اکتیویتی توی متغیرهای عمومی یک نمونه از این کلاس تعریف کنید، به این صورت :
private MyDatabase MyDataBase;

و بعد توی متد onCreate این خط کد رو بنویسین :
MyDataBase = new MyDatabase(this);

حالا هر جایی که خواستین دیتابیس رو باز کنین، میتونین از دو تا حالت getWritableDatabase() و getReadableDatabase() که برای خوندن و نوشتن هست استفاده کنین
به صورت زیر مثلا :

mydb = MyDataBase.getReadableDatabase();

وقتی getReadableDatabase استفاده میکنید، فقط عملیات خواندن رو میتونید انجام بدید

پس برای نوشتن یا آپدیت و دیلت باید از getWritableDatabase استفاده کنید

به همین سادگی، فقط باید تمام این مراحل رو به ترتیب و همینطور که گفتم انجام بدید که به مشکل نخورید
( zip کردن دیتابیس برای اینه که توی اندروید 10 به پایین خطا نگیرید )

آموزش کار با دیتابیس ( خواندن، نوشتن، آپدیت و دیلت ) توی همین تاپیک قرار داده شده

لطفا بعد از مطالعه درصورت وجود مشکل سوال بپرسید در خدمتم

----------------------------------------------------------------------------------------------

برای آپدیت کردن اطلاعات دیتابیس آماده به این پست (http://barnamenevis.org/showthread.php?441406-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-SQLite-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-%D8%A8%D8%AF%D9%88%D9%86-%D9%86%DB%8C%D8%A7%D8%B2-%D8%A8%D9%87-%DA%A9%D9%84%D8%A7%D8%B3-DataBaseHelper&p=1989704&viewfull=1#post1989704)مراجعه کنید

اگر مفید واقع شد، دکمه تشکر این پایینه :لبخند:

ببخشید ما تازه واردیم! اون جا که گفتین کلس رو ساختیم اسم دیتابیس رو تعریف کنم همین کلسیه که دیتابیس رو توش تعریف کردیم؟ چون که وقتی میخوام oncreate رو بزارم با ctrl+space متد نمیاد
(Bundle saved istance)

poorman
شنبه 27 اردیبهشت 1393, 22:02 عصر
منظور سوالتون رو شاید درست متوجه نشده باشم

اسم دیتابیس رو توی کلاس MyDatabase بذارید، همون کلاسی که کدش رو گذاشتم

بعدش توی اکتیویتی تون از اون کلاس یک متغیر تعریف میکنید و دیتابیستون رو باهاش مقدار میدین

mahmood.smaili
یک شنبه 04 خرداد 1393, 14:04 عصر
سلام من میخوام اطلاعات رو از جدولم بگیرم بریزم تو یه Cursor منتها ایراد میگیره
می تونید کمکم کنید با تشکر




Button btnsearch =(Button) findViewById(R.id.btnsearchs);
btnsearch.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
EditText searchbtn =(EditText) findViewById(R.id.searchtxt);
String mean=DataBase.COLUMN_MEANS;
String table=DataBase.TABLE_DIC;
String word=DataBase.COLUMN_WORDS;
String txtword=searchbtn.getText().toString();
c = dbase.rawQuery("SELECT "+mean+" FROM "+ table +" WHERE "+word+" ='"+txtword+"'", null);


البته اینم خطاهای لوگ کت


119456

poorman
یک شنبه 04 خرداد 1393, 20:10 عصر
من الان متوجه نمیشم خطا از کجای کدتون هست، اما چیزی که مشخصه خطا از دیتابیستون نیست

اگر هم خطا از دیتابیستون باشه شاید قبلش دیتابیس رو مقدار ندادید و باز نکردید


احتمالات دیگه رو امتحان کنید، به جای اینکه مقدار رو از تکست ویو بگیرید و اسم ستون ها و جداول رو از کلاس database بگیرید، اینا رو خودتون توی کوئری تایپ کنید ببینید درست کار میکنه؟

mahmood.smaili
یک شنبه 04 خرداد 1393, 20:45 عصر
با تشکر

اینکاری که گفتین انجام دادم
قبل کد هم دیتابیس رو باز کرده بودم و هم مقدار رو قبلش بهش داده بودم
منتها اررو میده
کد اپدیت هم همین ارور رو میده

poorman
یک شنبه 04 خرداد 1393, 20:50 عصر
بعد از اینکه اطلاعات رو میریزید داخل cursor چه کار میکنید ؟ کد اون قسمت مشکلی نداره ؟

قبل و بعد از کوئری توی یک logCat بذارید ببینید خطا دقیقا از کوئری تون هست یا قسمت های دیگه

mahmood.smaili
یک شنبه 04 خرداد 1393, 21:30 عصر
تشکر

فعلا فقط داخل Cursor میریزم وهیچ کاری باهاش نمی کنم ، ممکنه مشکل از اون باشه؟
اینیم که گفتین چک کردم
قبل کوئری لوگ داد
لوگ بعد کوئری رو نداد

poorman
یک شنبه 04 خرداد 1393, 21:36 عصر
پس تنها دلیلش میتونه این باشه که دیتابیس رو مقدار ندادین یا بازش نکردین

بهتره هرجایی که با دیتابیس کار دارین همونجا بازش کنین و بعد از تموم شدن کارتون اون رو ببندید

mahmood.smaili
یک شنبه 04 خرداد 1393, 21:47 عصر
آقا این کاری رو هم که گفتین انجام دادم نشد

مرسی از لطفتون که راهنماییم کردین

hamedjj
پنج شنبه 08 خرداد 1393, 00:45 صبح
poorman جان اگه بخواهیم رو لیست ویو فیلتر بزاریم باید چیکار کنیم
مثلا بگیم اونایی که تو ستون favorite برابر yes هستند را نشان بده

همه را بخواهیم نشون بدیم که اینجوریه :

public void adaptList(Cursor sms) {
String[] array = new String[sms.getCount()];
int i = 0;
if (sms.moveToFirst()) {
do {
try {
array[i] = sms.getString(sms.getColumnIndex("rowid"));
i++;
} catch (Exception e) {
e.printStackTrace();
}
} while (sms.moveToNext());
}

listview = (ListView) findViewById(R.id.listpishvaz);
listview.setAdapter(new SmsListAdapter(this, array));

poorman
پنج شنبه 08 خرداد 1393, 02:36 صبح
شما اگه بخوای خیلی ساده انجام بدی، این کار رو با کوئری میکنی به این صورت :

select * from yourTable where favorite = "yes"

و بعد اطلاعات رو میریزی توی آرایه و میدی به لیست

راههای سخت ترش میتونه این باشه که همین cursor که الان داری رو فیلتر کنی و بعد اطلاعاتش رو بریزی توی آرایه ( من فیلتر cursor رو کار نکردم )

راه دیگه میتونه این باشه که وقتی داری اطلاعات cursor رو میریزی توی آرایه، یک شرط بذاری که اگر مقدار cursor.getString(cursor.getColumnIndex("favorite") برابر yes بود اطلاعات رو بریزه توی آرایه

حالا دقیقا نمیدونم نیازت چیه و کجا میخوای این رو پیاده سازی کنی

hamedjj
پنج شنبه 08 خرداد 1393, 19:15 عصر
همون روش اول که گفتی به جای کوئری زیر همونی گفتی را قرار میدیم ؟
MyDatabase myDatabase = new MyDatabase(this);
SQLiteDatabase mydb = myDatabase.getReadableDatabase();
Cursor sms = mydb.rawQuery("select rowid from sms" , null);

بعدش تو کد آرایه چیکار باید بکنیم :
public void adaptList(Cursor sms) {
String[] array = new String[sms.getCount()];
int i = 0;
if (sms.moveToFirst()) {
do {
try {
array[i] = sms.getString(sms.getColumnIndex("rowid"));
i++;
} catch (Exception e) {
e.printStackTrace();
}
} while (sms.moveToNext());
}

listview = (ListView) findViewById(R.id.listpishvaz);
listview.setAdapter(new SmsListAdapter(this, array));

poorman
پنج شنبه 08 خرداد 1393, 19:32 عصر
آره کوئری رو با اون چیزی که گفتم عوض میکنی

توی کد آرایه لازم نیست چیزی رو تغییر خاصی بدی، همه چیز مثل قبل هست، فقط با این کوئری سطرهایی توی cursor ریخته میشن که favorite = "yes" باشه

البته من توی اون کوئری گفتم select * ، این یعنی تمام ستون ها رو برگردونه، اما شما هرچیزی که لازم داری رو بگو مثلا select rowid

hamedjj
پنج شنبه 08 خرداد 1393, 19:40 عصر
آره کوئری رو با اون چیزی که گفتم عوض میکنی

توی کد آرایه لازم نیست چیزی رو تغییر خاصی بدی، همه چیز مثل قبل هست، فقط با این کوئری سطرهایی توی cursor ریخته میشن که favorite = "yes" باشه

البته من توی اون کوئری گفتم select * ، این یعنی تمام ستون ها رو برگردونه، اما شما هرچیزی که لازم داری رو بگو مثلا select rowid

دمت گرم ... حل شد
خیلی حال دادی
فدایی داری

badname
پنج شنبه 08 خرداد 1393, 21:05 عصر
میشه چندتا مورده استفاده خوب که واقعا استفاده از این خوبه رو بگید تا پروژه تون قشنگ برام جا بیوفته ؟

poorman
پنج شنبه 08 خرداد 1393, 21:35 عصر
میشه چندتا مورده استفاده خوب که واقعا استفاده از این خوبه رو بگید تا پروژه تون قشنگ برام جا بیوفته ؟

من متوجه سوالتون نشدم !!!

در مورد استفاده از چی دارید سوال میکنید ؟ دیتابیس ؟ یا لایبری SQLite asset helper ؟

badname
پنج شنبه 08 خرداد 1393, 21:51 عصر
من متوجه سوالتون نشدم !!!

در مورد استفاده از چی دارید سوال میکنید ؟ دیتابیس ؟ یا لایبری SQLite asset helper ؟
دقیقا دیتابیس :لبخندساده:
چون تاحالا استفاده نکردم برام جا نیوفتاده تو چه مواری استفاده میشه ازش
یسری نیاز های خاص همیشه باعث ایجاد پروژه میشن.
میخواستم موارد استفاده شو بدونم و اینکه چه نیاز هایی رو برطرف میکنه :لبخندساده:

poorman
پنج شنبه 08 خرداد 1393, 22:47 عصر
دیتابیس یا به زبون خودمون پایگاه داده، واسه ذخیره اطلاعات زیاد و دسترسی بهشون و تغییر راحت اطلاعات استفاده میشه

به عنوان مثال اطلاعات کارمندان یک اداره رو میتونید توی دیتابیس ذخیره کنید که هم راحت بهش دسترسی داشته باشید و هم راحت بتونید اونا رو تغییر بدید یا حذف کنید

یا یک مثال خیلی ساده متن یک کتاب رو داخل دیتابیس بریزید، اینطوری علاوه بر نظم توی نگهداری اطلاعات، میتونید از قابلیت جستجو هم بهره ببرید

کلا فواید زیادی داره، یک پروژه بزرگ رو خیلی سخت میشه بدون دیتابیس پیاده سازی کرد

badname
پنج شنبه 08 خرداد 1393, 22:56 عصر
دیتابیس یا به زبون خودمون پایگاه داده، واسه ذخیره اطلاعات زیاد و دسترسی بهشون و تغییر راحت اطلاعات استفاده میشه

به عنوان مثال اطلاعات کارمندان یک اداره رو میتونید توی دیتابیس ذخیره کنید که هم راحت بهش دسترسی داشته باشید و هم راحت بتونید اونا رو تغییر بدید یا حذف کنید

یا یک مثال خیلی ساده متن یک کتاب رو داخل دیتابیس بریزید، اینطوری علاوه بر نظم توی نگهداری اطلاعات، میتونید از قابلیت جستجو هم بهره ببرید

کلا فواید زیادی داره، یک پروژه بزرگ رو خیلی سخت میشه بدون دیتابیس پیاده سازی کرد
خیلی جامع و کامل بود ، دیدم بازتر شد نسبت به قبل :لبخندساده:
این اطلاعات فقط از جنس متن میتونن باشن یا چیز دیگه ای ام میتونن باشن
مثلا تو همون اطلاعات کارمندان یه اداره میتونیم عکس کارمندامونم تو دیتابیس داشته باشیم ؟ یا صدا یا هر نوع ایتم دیگه ای ...

poorman
پنج شنبه 08 خرداد 1393, 23:35 عصر
انواع زیادی از اطلاعات رو میشه توی دیتابیس ذخیره کرد

عکس به صورت بایت توی دیتابیس ذخیره میشه و میشه راحت ازش خوند

اطلاعات منطقی مثل true, false و بیشتر انواع داده رو میتونید توی دیتابیس ذخیره کنید

narvanco
جمعه 09 خرداد 1393, 12:04 عصر
دوستان من یه دیتابیس ساختم که 7تا تیبل داره.
میخوام هر کدوم از اونا رو داخل یه لیست ویو نمایش بدم.
میشه راهنماییم کنید از همون اول چکار کنم؟
من تازه کار هستم و با دیتابیس کار نکردم.تمام پستها رو هم خوندم اما بازم نتونستم پیاده سازی کنم.
لطفا راهنماییم کنید.متشکرم

poorman
جمعه 09 خرداد 1393, 14:43 عصر
دوستان من یه دیتابیس ساختم که 7تا تیبل داره.
میخوام هر کدوم از اونا رو داخل یه لیست ویو نمایش بدم.
میشه راهنماییم کنید از همون اول چکار کنم؟
من تازه کار هستم و با دیتابیس کار نکردم.تمام پستها رو هم خوندم اما بازم نتونستم پیاده سازی کنم.
لطفا راهنماییم کنید.متشکرم

دوست عزیز شما توی کدوم قسمت مشکل دارید ؟

دیتابیستون آماده هست یا از طریق کد ساختید ؟

تا حالا با لیست ویو کار کردید ؟

اگر با لیست ویو کار کردید، توی پست اول، قسمت خواندن اطلاعات، من توضیح دادم که چطور اطلاعات رو از یک تیبل داخل آرایه بریزید، بعد از اینکه شما اطلاعات رو داخل آرایه ریختید خیلی راحت اونا رو میفرستید به آداپتر لیست ویو خودتون و نمایش میدید

میتونید از نمونه برنامه های آماده هم استفاده کنید تا کمک بگیرید برای پروژتون

http://barnamenevis.org/showthread.php?401729-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF&p=2016418&viewfull=1#post2016418

narvanco
جمعه 09 خرداد 1393, 14:55 عصر
ممنونم از توجهتون
بله دیتابیسم آمادست
مشکل من اینه که واسه 7تا تیبل نمیدونم باید چجوری بیارم؟
بله قبل از اینکه سوالمو مطرح کنم این نمونه رو گرفتم.اما اونم فقط یک تیبل داره و نتونستم مشکلمو باهاش رفع کنم.
واسه اینکه 7تا تیبل دارم باید اونا رو چطور فراخوانی کنم؟
بله با لیست ویو کار کردم اما تا الان با آرایه لیست ویومو پر میکردم.
این هم همینطور پر میشه؟

poorman
جمعه 09 خرداد 1393, 15:13 عصر
شما میخواین اطلاعات هر 7 تا تیبل رو با هم بریزید توی لیست ویو ؟ یا اینکه هر کدوم رو توی یک اکتیویتی و یک لیست ویو جدا نمایش بدید ؟

اگر میخواین هرکدوم رو جدا نمایش بدید که کار مثل قبله و هیچ فرقی نداره، فقط باید اسم تیبل عوض شه

اگر میخواین همه رو با هم نمایش بدید، شما باید این کار رو برای هر تیبل انجام بدید اما به این دلیل که شما ممکنه ندونید چقدر اطلاعات دارید که فضای مشخصی از آرایه رو بهش اختصاص بدید

بهتره ابتدا اطلاعات رو داخل arrayList بریزید، یعنی ابتدا واسه تیبل اول کوئری مینویسید و اطلاعاتش رو داخل arrayList اضافه میکنید، بعد دوباره برای تیبل دوم همینکار رو میکنید و تا تیبل آخر

حالا arrayList شما حاوی اطلاعاتتون هست، آرایه خودتون رو براساس سایز arrayList دوباره سازی کنید و اطلاعات رو از arrayList بریزید داخل آرایه ( توسط یک حلقه )

البته اگر شما کار با کاستوم آداپتر لیست ویو رو یاد دارید میتونید با انجام یکسری تغییرات به جای اینکه ورودی آداپترتون آرایه باشه، همون arrayList رو مستقیم بفرستید به آداپتر و از انجام محاسبات اضافی پیشگیری کنید

---------------------------------------------------------------

برای توضیح بیشتر بهتره بگم که آرایه نیاز داره که فضای مشخصی داشته باشه و وقتی فضاش مشخص شد نمیتونیم بیشتر از اون مقدار بدیم بهش

اما arrayList یک نوع آرایه بدون محدودیت فضاست، ما میتونیم بدون مشخص کردن تعداد خونه ها، هر اندازه که خواستیم به اون اضافه کنیم و البته یکسری قابلیت های خوب دیگه هم داره

narvanco
جمعه 09 خرداد 1393, 15:24 عصر
خیلی خیلی ممنونم از وقتی که میزارید.
بله هر تیبل توی یه لیست جداگانه نمایش داده میشه.
پس فقط لازمه توی هر اکتیویتی نام جدول رو تغییر بدم؟درسته؟ با توجه به اینکه ستونهای تیبلها یک نوع هستند.
انشاالله شروع میکنم و دوباره میسازم.قبلا که چندبار ساختم نشد.یه بار صفحه اومد اما اطلاعات رو از دیتابیس نخوند و بار دوم هم که اصلا تا اکتیویتی میخواد بیاد بسته میشه D:
ممنونم از وقتی که گذاشتید.
در ضمن آقا ، هم شهری هم هستیماا!!
موفق باشید

narvanco
جمعه 09 خرداد 1393, 15:32 عصر
آقا عذر میخوام یه سوال دیگه
ببخشید
این نام دیتابیس منظور چیه؟
توی ساخت دیتابیس بهش دادیم؟ یا یک نامی که تو کلاس دیتابیس میسازیم و اصلا ربطی به اون نامی که موقع ساختن دیتابیس آماده دادیم نداره؟

poorman
جمعه 09 خرداد 1393, 15:38 عصر
شما اگه از دیتابیس آماده استفاده میکنید، توی پست اول فقط از قسمت وارد کردن اطلاعات در جدول به بعد استفاده کنید

چون قبل از اون دارم ساخت دیتابیس داخل خود اکلیپس و باز کردنش رو توضیح میدم

توی دیتابیس آماده اسم فایلتون رو که با پسوند .db.zip تعریف میکنید و توی کلاس دیتابیس هم اسم رو با پسوند .db مینویسید، بعد از انجام اینکارا، شما دیگه هیچ کاری با اسم دیتابیس ندارید

فقط توی اکتیویتی میگید mydb = mydatabase.getReadable

narvanco
جمعه 09 خرداد 1393, 15:49 عصر
ممنونم از لطفتون.بزرگواری کردید

ebrahim1988
شنبه 10 خرداد 1393, 09:49 صبح
اگه ممکنه یه تکه کد بزارید که من چطوری اطلاعات cursor رو تو listview نشون بدم -- مثال کامل نمیخوام چون تو مثال کامل هر کسی از روش خودش همه جای برنامه رو تغییر داده و این منو گیج میکنه -- مرسی

poorman
شنبه 10 خرداد 1393, 16:26 عصر
اگه ممکنه یه تکه کد بزارید که من چطوری اطلاعات cursor رو تو listview نشون بدم -- مثال کامل نمیخوام چون تو مثال کامل هر کسی از روش خودش همه جای برنامه رو تغییر داده و این منو گیج میکنه -- مرسی

این چیزی که شما میخواید اگر یک لیست با یک آیتم تکس ( لیست ساده ) باشه مشکلی نیست، اما اگر مثال یک لیست ویو کاستوم رو میخواین کدهاش یک تکه نیست، 2 تا کلاس و xml هست و راهی نیست جز اینکه از مثال های آماده استفاده کنید

توی یک لیست ساده میشه با 4 تا خط کد لیست رو پیاده سازی کرد، اما توی لیست ویو کاستوم شما باید یک کلاس آداپتر داشته باشید و اونجا آیتم های لیست رو مقدار بدید

مثال های آماده رو اگر سعی کنید قشنگ آنالیز کنید گیج نمیشید، فقط باید یکم وقت بذارید دیگه

من یک مثال خیلی ساده میذارم اینجا امیدوارم کمک کنه، این مثال از جدول شما اطلاعات ستون اول رو میخونه و داخل لیست نمایش میده

import android.app.Activity;import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;


public class mesal_list extends Activity {

ListView listView ;
SQLiteDatabase mydb;
private static String DBNAME = "PERSONS"; // اگر دیتابیس رو داخل اکلیپس ساختید اسمش رو اینجا مشخص کنید
private static String TABLE = "MY_TABLE"; // THIS IS THE TABLE NAME

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);

listView = (ListView) findViewById(R.id.listView1);

// اگر دیتابیس رو داخل اکلیپس ساختید از این روش شیء دیتابیس رو مقدار بدید
mydb = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);
// اگر دیتابیستون آماده هست از روش های گفته شده در قسمت دیتابیس آماده استفاده کنید

// اینجا تمام اطلاعات رو از جدول میخونیم
// این کوئری میتونه بر اساس نیاز شما تغییر پیدا کنه
// میتونید تنها ستونهای مورد نظرتون رو انتخاب کنید یا با گذاشتن شرط فقط سطرهای واجد شرط رو انتخاب کنید
Cursor allrows = mydb.rawQuery("SELECT * FROM "+ TABLE, null);
String[] NAME = new String[allrows.getCount()];
int i = 0;
if(allrows.moveToFirst()){
do{
// اینجا فقط اطلاعات ستون اول خوانده میشود
// بر اساس نیاز شماره داخل تابع گت استرینگ را تغییر دهید
NAME[i] = allrows.getString(0);
i++;
}
while(allrows.moveToNext());
}
allrows.close();
mydb.close();


ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, android.R.id.text1, NAME);


listView.setAdapter(adapter);
}


}

narvanco
شنبه 10 خرداد 1393, 18:53 عصر
آقای poorman ؟
میشه تقاضا کنم اگه ممکنه یه نمونه برنامه از دیتابیس که 2تا جدول داره و محتویات یک ستون آنها در لیست ویو فراخوانی میکنه در دو صفحه رو معرفی کنید یا در صورت امکان خودتون لطف کنید.چند هفته است نمیتونم انجامش بدم.خیلی ضروریه.
فکر میکنم سوال خیلی از دوستان دیگمون هم باشه
خیلی ممنونم ازتون
خدا به علم شما برکت بیش از این بده

poorman
شنبه 10 خرداد 1393, 20:26 عصر
آقای poorman ؟
میشه تقاضا کنم اگه ممکنه یه نمونه برنامه از دیتابیس که 2تا جدول داره و محتویات یک ستون آنها در لیست ویو فراخوانی میکنه در دو صفحه رو معرفی کنید یا در صورت امکان خودتون لطف کنید.چند هفته است نمیتونم انجامش بدم.خیلی ضروریه.
فکر میکنم سوال خیلی از دوستان دیگمون هم باشه
خیلی ممنونم ازتون
خدا به علم شما برکت بیش از این بده

والا من خیلی درگیرم، شما لطف کنید یک پروژه نمونه بسازید از چیزی که میخواین و تا جایی که تونستید پیاده سازی کنید

پروژه رو بذارید اینجا تا من اشکالاتش رو رفع کنم، هم به شما کمک بشه، هم به بقیه دوستان اگر چنین مشکلی دارن

hamedjj
یک شنبه 11 خرداد 1393, 01:54 صبح
سلام poorman (http://barnamenevis.org/member.php?295320-poorman) جان
من میخوام رو یه پروژه پیامک کار کنم
میخواستم بدونم دیتابیس را باید چطوری بسازم؟
مثلا 10 تا table (برای هر موضوع یکی)درست کنم که تو هر table یه ستون متن و یه ستون علاقه مندی ها بزارم ؟
یا اینکه باید یه table درست کنم در 20 تا ستون توش بزارم و هر دو ستون یکی موضوع پیامک و دیگری علاقه مندی برای اون موضوع؟

کدومش درسته؟

poorman
یک شنبه 11 خرداد 1393, 02:42 صبح
سلام poorman (http://barnamenevis.org/member.php?295320-poorman) جان
من میخوام رو یه پروژه پیامک کار کنم
میخواستم بدونم دیتابیس را باید چطوری بسازم؟
مثلا 10 تا table (برای هر موضوع یکی)درست کنم که تو هر table یه ستون متن و یه ستون علاقه مندی ها بزارم ؟
یا اینکه باید یه table درست کنم در 20 تا ستون توش بزارم و هر دو ستون یکی موضوع پیامک و دیگری علاقه مندی برای اون موضوع؟

کدومش درسته؟

سلام

اول بذار تشکر کنم که اومدی پرسیدی، چون من یک برنامه توی بازار دیدم که بنده خدا سازندش واقعا معماری خنده داری واسه دیتابیسش داشت

یک کتاب بود با 15 تا فصل، این اومده بود 15 تا ستون گذاشته بود واسه هرفصل یک ستون، بعد اینا رو مقدار داده بود و ...

البته اینو بگم من اصلا توی دیتابیس خودم رو حرفه ای نمیدونم

حالا بیخیال

آقا برنامه پیامک شما اگر تعداد رکوردهات زیاد هست، یعنی 30-40 هزار تا پیامک داری، از نظر سرعت در سرچ و ... با فرض اینکه 20 موضوع داری، بهتره که 20 تا تیبل داشته باشی

اگر تعداد کمه یا به هر دلیلی حال و حوصله نداری، شما دو تا تیبل میسازی، توی یکی از شماره 1 تا 20 موضوعات رو وارد میکنی ( دو تا ستون، یکی آیدی، یکی اسم موضوع)

توی جدول دوم که پیامک هات رو وارد میکنی، یک ستون میذاری واسه موضوع، بعد هر پیامک رو میگی موضوعش شماره چنده

توی برنامه هم خیلی راحت select میکنی رکوردهایی رو که موضوعشون شماره فلان هست

hamedjj
یک شنبه 11 خرداد 1393, 02:58 صبح
پس همون روش اولو درست میکنم چون 10000 تا هست.

یه سوال دیگه اینه که خوب تو صفحه اصلی یه لیست ویو داریم که نام موضوعات را توش قرار میدیم
تو کلاس دوم هم که لیست پیامک ها با کلیک روی آیتم های لیست میاد

کلاس دوم که لیست پیام ها توش هست یه کلاس arrayadapter هم کنار خودش داره
چطور باید این table ها را در این کلاس معرفی کنم

تو لیست موضوعات که خو میدونم با putExtra مقداری از اکتیویتی اول به دوم میفرستی و در دومی دریافت میکنی که اگه اولی کلیک شد اینو نشون بده یا دومی اینو و...

ولی دیتابیس ما در کلاس array adapter معرفی میشه که در لیست ویو کلاس دیگری نمایش داده میشه
متد بالا هم که گفتم مقدار داده را به کلاسی که در اینتنت معرفی میکنی میفرسته
اینو باید چیکار کنیم؟

یعنی :
Intent intent = new Intent(this, SmsList.class);
intent.putExtra("button", 101);
startActivity(intent);

و تو کلاس adapter یک table را تعریف کردیم
Cursor cur = mydb.rawQuery("SELECT rowid,matn,favorite FROM sms WHERE rowid='"+values[position]+"'", null);

poorman
یک شنبه 11 خرداد 1393, 03:36 صبح
من که نفهمیدم چی سوال کردی :لبخند:

الان کل مشکلت اینه که چطور به کلاس آداپتر لیست ویو بفهمونی داره با کدوم تیبل کار میکنه ؟

یک متغیر جهانی بذار، هر آیتمی که انتخاب شد، موقعیتش رو توی اون ذخیره کن

توی کلاس آداپتر هم اون موقعیت رو بگیر

درست فهمیدم سوالت رو یا نه ؟؟؟

hamedjj
یک شنبه 11 خرداد 1393, 12:22 عصر
من که نفهمیدم چی سوال کردی :لبخند:

الان کل مشکلت اینه که چطور به کلاس آداپتر لیست ویو بفهمونی داره با کدوم تیبل کار میکنه ؟

یک متغیر جهانی بذار، هر آیتمی که انتخاب شد، موقعیتش رو توی اون ذخیره کن

توی کلاس آداپتر هم اون موقعیت رو بگیر

درست فهمیدم سوالت رو یا نه ؟؟؟

آره دقیقا درست فهمیدی
فقط من دقیقا جوابتو نفهمیدم :لبخند:
تونستی همین جوابو همراه با دو خط کد نشون بده متوجه بشم
فدا

hamedjj
یک شنبه 11 خرداد 1393, 19:08 عصر
آره دقیقا درست فهمیدی
فقط من دقیقا جوابتو نفهمیدم :لبخند:
تونستی همین جوابو همراه با دو خط کد نشون بده متوجه بشم
فدا

آقا حل شد
دمت گرم .. فاز دادی

hamedjj
یک شنبه 11 خرداد 1393, 19:54 عصر
من یه کلاس درست کردم به اسم علاقه مندی که میخوام آیتم هایی که به علاقه مندی اضافه شد (در تمام table ها) را در این کلاس نشون بدم
باید چطور این کار را بکنم؟
تو هر table یه ستون با نام favorite ساختم که مقدارش به yes تبدیل میشه
میشه اینطور نوشت؟ چند تا تیبل را با هم فراخونی کرد

Cursor cursor = mydb.rawQuery("select rowid from table1,table2,table3,table4 where favorite = 'yes'" , null);

hamedjj
دوشنبه 12 خرداد 1393, 00:24 صبح
فکر کنم باید از دستور GROUP BY استفاده کرد . ولی بازم ارور میده .. شاید درست ننوشتمش
این لینک را ببینید
http://stackoverflow.com/questions/11029538/sqlite-query-from-multiple-tables-using-sqlitedatabase

poorman
دوشنبه 12 خرداد 1393, 00:42 صبح
من یه کلاس درست کردم به اسم علاقه مندی که میخوام آیتم هایی که به علاقه مندی اضافه شد (در تمام table ها) را در این کلاس نشون بدم
باید چطور این کار را بکنم؟
تو هر table یه ستون با نام favorite ساختم که مقدارش به yes تبدیل میشه
میشه اینطور نوشت؟ چند تا تیبل را با هم فراخونی کرد

Cursor cursor = mydb.rawQuery("select rowid from table1,table2,table3,table4 where favorite = 'yes'" , null);

نه اینطوری که نمیشه از چند تا تیبل خوند، کوئری غلطه


فکر کنم باید از دستور GROUP BY استفاده کرد . ولی بازم ارور میده .. شاید درست ننوشتمش
این لینک را ببینید
http://stackoverflow.com/questions/11029538/sqlite-query-from-multiple-tables-using-sqlitedatabase

دستور group by برای گروه بندی کردنه، اصلا ربطی به ماجرای چند تا تیبل نداره

برای اینکه از چند تا تیبل یکجا بخونی باید از دستور UNION استفاده کنی، من خودم تا حالا ازش استفاده نکردم چون نیاز نداشتم

این لینک میتونه کمکت کنه

http://www.w3schools.com/sql/sql_union.asp

اگر به هر دلیلی نتونستی، من خودم اسم جدول ها رو میریزم توی یک آرایه، بعد توی یک حلقه هی از هر جدول SELECT میکنم و میریزم توی ListArray

راه حل درستی شاید نباشه، اما حوصله ندارم چیز دیگه رو پیدا سازی کنم :لبخند:

hamedjj
دوشنبه 12 خرداد 1393, 01:14 صبح
union مطمئنی درسته؟ عملگر UNION به صورت پیش فرض فقط مقادیر متمایز را انتخاب می کنه
UNION ALL هم که همه رو

فکر کنم باید از INNER JOIN استفاده کنم:

البته یکی از بچه ها گفته از این گرامر استفاده کن :

SELECT Table1.Column1 , Table2.Column1 [,Table3.Column1 ...]
FROM Table1,Table2 [,Table3.Column1 ...]
WHERE Table1.Column1==Table2.Column1 [AND OR ... other Conditions]

hamedjj
دوشنبه 12 خرداد 1393, 01:35 صبح
حرفت درست بود آخرش را نخوندم

پاسخ:

SELECT rowid FROM table1
WHERE favorite='yes'
UNION ALL
SELECT rowid FROM table2
WHERE favorite='yes'

poorman
دوشنبه 12 خرداد 1393, 01:38 صبح
ویرایش : تا من اومدم جواب بدم خودت جواب درست رو گفتی دیگه :لبخندساده:


---------------------------------------------------------------------

گفتم که من استفاده نکردم، ولی JOIN هم کاربردش متفاوت هست، برای وقتی هست که میخوای دو تا تیبل رو با هم میکس کنی

این کوئری که یکی از بچه ها گفته رو فک نمیکنم جواب بده، یه جورایی مثل همون JOIN هست

الان از تست کردن که کسی ضرر نمیکنه، دو تا جدول رو با هم UNION ALL کن ببین چی میشه

hamedjj
دوشنبه 12 خرداد 1393, 01:45 صبح
ویرایش : تا من اومدم جواب بدم خودت جواب درست رو گفتی دیگه :لبخندساده:


---------------------------------------------------------------------

گفتم که من استفاده نکردم، ولی JOIN هم کاربردش متفاوت هست، برای وقتی هست که میخوای دو تا تیبل رو با هم میکس کنی

این کوئری که یکی از بچه ها گفته رو فک نمیکنم جواب بده، یه جورایی مثل همون JOIN هست

الان از تست کردن که کسی ضرر نمیکنه، دو تا جدول رو با هم UNION ALL کن ببین چی میشه

حرفت درسته join با هم میکس میکنه
باید UNION ALL همراه با WHERE قرار میدادم که مقادیر yes را بگیره
من آخر سر این دیتابیس خودمو دار میزنم:عصبانی++: .. واقعا دردسره
بازم فدایی داری :تشویق:

narvanco
پنج شنبه 15 خرداد 1393, 17:35 عصر
سلام دوستان
لطفا راهنماییم کنید چطوری میشه مکان اسکرول رو در دیتابیس ذخیره کرد تا وقتی از لیست به یه مطلب میریم و برمیگردیم دوباره لیست از اول شروع نشه و از همونجایی که بودیم ادامه پیدا کنه.
ممنونم

poorman
جمعه 16 خرداد 1393, 04:27 صبح
سلام دوستان
لطفا راهنماییم کنید چطوری میشه مکان اسکرول رو در دیتابیس ذخیره کرد تا وقتی از لیست به یه مطلب میریم و برمیگردیم دوباره لیست از اول شروع نشه و از همونجایی که بودیم ادامه پیدا کنه.
ممنونم

سلام

میخواین موقعیت لیست ویو رو ذخیره کنید؟

این کار رو حتما نیازی نیست با دیتابیس انجام بدید، با shared preferences (http://barnamenevis.org/showthread.php?447908-%D8%A7%DB%8C%D9%86-%D9%87%D9%85-%DA%A9%D8%AF&p=2008744&viewfull=1#post2008744) هم میشه این کار رو انجام داد

پیدا کردن موقعیت لیست رو میتونید اینطوری انجام بدید

وقتی کاربر داره خارج میشه دو مقدار listIndex و ListTop رو ذخیره کنید از نوع int توی Shared Preferences (http://barnamenevis.org/showthread.php?447908-%D8%A7%DB%8C%D9%86-%D9%87%D9%85-%DA%A9%D8%AF&p=2008744&viewfull=1#post2008744)

به این صورت

listIndex = list.getFirstVisiblePosition();
View view = list.getChildAt(0);
listTop = view.getTop();


وقتی کاربر دوباره وارد شد اطلاعات رو از shared preferences بخونید و لیست رو به موقعیت ذخیره شده ببرید، با این کد

list.setSelectionFromTop(listIndex, listTop);

davoodi
پنج شنبه 29 خرداد 1393, 09:26 صبح
سلام استاد.
میشه توضیح بدید برای لیست ویو یی که بصورت arrayadapter با دیتاهایی که از database به روشی که اموزش دادید استخراج میشه چطور میشه جستجو قرار داد؟
من در برنامه ام دیتا رو از دیتابیس میگیرم و در یک فایل xml که نحوه نمایش سطرحا رو در اون قرار دادم میریزم و نمایش میدم.
حالا میخوام امکان جستجو رو هم در اون فایل قرار بدم.
اما وقتی edittext رو در XML مینویسم توی همه سطرها تکرار میشه.
ممنون میشم راهنماییم کنید.
با تشکر.

poorman
پنج شنبه 29 خرداد 1393, 19:43 عصر
سلام استاد.
میشه توضیح بدید برای لیست ویو یی که بصورت arrayadapter با دیتاهایی که از database به روشی که اموزش دادید استخراج میشه چطور میشه جستجو قرار داد؟
من در برنامه ام دیتا رو از دیتابیس میگیرم و در یک فایل xml که نحوه نمایش سطرحا رو در اون قرار دادم میریزم و نمایش میدم.
حالا میخوام امکان جستجو رو هم در اون فایل قرار بدم.
اما وقتی edittext رو در XML مینویسم توی همه سطرها تکرار میشه.
ممنون میشم راهنماییم کنید.
با تشکر.

سلام دوست عزیز
من اصلا متوجه نشدم شما دقیقا دارید چکار میکنید
برای جستجو نیاز به کار اضافی نیست
دقیقا مثل همون اول که از دیتابیس میخونید و آداپتر لیست رو مقدار میدید، اینجا برای جستجو فقط توی کوئری توی یک شرط میذارید

مثلا اگر میخواین از ادیت تکس متن رو بگیره و جستجو کنه روی یک ستون به اسم myColumn در جدول myTable

Cursor c = mydb.execSQL("select * from myTable where myColumn = '" + editText.getText() + "'");
کوئری بالا توی جستجو سطرهایی رو برمیگردونه که ستون myColumn اونا دقیقا برابر ادیت تکست باشه

اما اگر میخواین درصورتی که ستون شامل این کلمه هم بود نتیجه بده، مثلا مقدار ستون "شرکت فلان پرداز" هست و شما کلمه "فلان" رو سرچ میکنی
برای اینکه نتیجه بگیری باید از کوئری زیر استفاده کنید

Cursor c = mydb.execSQL("select * from myTable where myColumn = '%" + editText.getText() + "%'");
علامت درصد (%) بیانگر اینه که میتونه هرچیزی باشه، شما میتونید هرجایی که خواستید درصد بذارید، به این معنی که مهم نیست اونجا چی باشه

حالا بعدش که اطلاعات رو ریختید توی cursor دقیقا مثل قبل اونا رو بریزید توی آداپتر لیست ویو و لیست ویو رو مقدار بدید

hamedjj
پنج شنبه 05 تیر 1393, 20:48 عصر
سلام poorman جان
یه لایبری تو github دیدم که ماشالله 1255 تا ستاره خورده بود و ماله دیتابیس sqlite هست
اسمش هست ActiveAndroid و خودش میگه که با این لایبری بدون اینکه یه خط از دستورات sql را بنویسی میتونی رکوردهای دیتابیس sqlite را ذخیره و فراخوانی کنی ...
شما که با دیتابیس زیاد کار کردی حتما یه نگاه بهش بنداز که شاید این از sqlite Asset helper بهتر باشه ... بعدش یه خبر بهمون بده

https://github.com/pardom/ActiveAndroid

فدا ....

poorman
پنج شنبه 05 تیر 1393, 21:05 عصر
سلام poorman جان
یه لایبری تو github دیدم که ماشالله 1255 تا ستاره خورده بود و ماله دیتابیس sqlite هست
اسمش هست ActiveAndroid و خودش میگه که با این لایبری بدون اینکه یه خط از دستورات sql را بنویسی میتونی رکوردهای دیتابیس sqlite را ذخیره و فراخوانی کنی ...
شما که با دیتابیس زیاد کار کردی حتما یه نگاه بهش بنداز که شاید این از sqlite Asset helper بهتر باشه ... بعدش یه خبر بهمون بده

https://github.com/pardom/ActiveAndroid

فدا ....

چشم وقت کردم نگاه میندازم بهش ببینم چه چیز خاصی ارائه میده :لبخندساده:

poorman
پنج شنبه 05 تیر 1393, 21:24 عصر
سلام poorman جان
یه لایبری تو github دیدم که ماشالله 1255 تا ستاره خورده بود و ماله دیتابیس sqlite هست
اسمش هست ActiveAndroid و خودش میگه که با این لایبری بدون اینکه یه خط از دستورات sql را بنویسی میتونی رکوردهای دیتابیس sqlite را ذخیره و فراخوانی کنی ...
شما که با دیتابیس زیاد کار کردی حتما یه نگاه بهش بنداز که شاید این از sqlite Asset helper بهتر باشه ... بعدش یه خبر بهمون بده

https://github.com/pardom/ActiveAndroid

فدا ....

من داکیومنت این لایبری رو خوندم

به نظر من این لایبری واسه کسایی که با دیتابیس SQL کار نکردن ممکنه خیلی خوب باشه

اما اگر شما قبلا با دیتابیس کار کرده باشین، این لایبری یکم مسخره به نظر میرسه

همچنین این لایبری هنگام کار با دیتابیس آماده و از پیش ساخته شده، دیتابیس رو به صورت ساده دریافت میکنه

اما SQLite asset Helper دیتابیس رو زیپ شده میخونه که باعث میشه حجم برنامه پایین بمونه

badname
پنج شنبه 05 تیر 1393, 21:34 عصر
عکس هم میشه insert کرد ؟ :لبخند:

poorman
پنج شنبه 05 تیر 1393, 21:36 عصر
عکس هم میشه insert کرد ؟ :لبخند:

نمیدونم، چیزی مخصوص عکس ننوشته بود

ولی فک کنم یه چیزایی بود که همه نوع داده ای رو میتونی insert کنی !!!

SaharAzizi
شنبه 07 تیر 1393, 10:41 صبح
سلام
همین طور که در جریان هستید من یک تازه کارم.
ممنون میشم که بگین توی مثالی که زدین چطوری میشه یک سطر خاص مـثلا id=3 رو توی یک TextVeiw نمایش بده
ممنون

ali-star
شنبه 07 تیر 1393, 16:32 عصر
سلام
آقای poorman (http://barnamenevis.org/member.php?295320-poorman) میدونید چطور میتونیم با استفاده از این کتابخوبه با استفاده از ListView توی دیتابیس جستجو کنیم؟

poorman
شنبه 07 تیر 1393, 18:25 عصر
سلام
همین طور که در جریان هستید من یک تازه کارم.
ممنون میشم که بگین توی مثالی که زدین چطوری میشه یک سطر خاص مـثلا id=3 رو توی یک TextVeiw نمایش بده
ممنون

سلام

کاری نداره شما باید برای کوئری فقط یک شرط بذارید تا اطلاعات اون سطر رو برگردونه

بعدش با اطلاعات هر کاری خواستی میکنی، اینجا چون میدونم فقط یک سطر جواب داریم، نیاز به حلقه تکرار و آرایه نیست دیگه

Cursor allrows = mydb.rawQuery("SELECT * FROM "+ TABLE + " where _id = 3", null);

if(allrows.moveToFirst()){
textView.setText(allrows.getString(1));
}
allrows.close();
mydb.close();



توی این مثال تمام ستون های سطری که فیلد _id اون برابر 3 هست انتخاب میشن، و بعد مثلا محتوای ستون دوم ( ایندکس 1 ) داخل تکست ویو نمایش داده میشه

poorman
شنبه 07 تیر 1393, 18:30 عصر
سلام
آقای poorman (http://barnamenevis.org/member.php?295320-poorman) میدونید چطور میتونیم با استفاده از این کتابخوبه با استفاده از ListView توی دیتابیس جستجو کنیم؟

سلام

این کتابخونه کار خاصی غیر از باز کردن دیتابیس و آپدیت ارائه نمیده، اینکه اطلاعات رو جستجو کنید یا بخونید همش دیگه دست شماست

برای اینکه جستجو کنید باید بر اساس یک فیلد این کار رو انجام بدید دیگه، مثلا بگید سطرهایی رو انتخاب کن که فیلد نوع اونها برابر یه چیزی باشه

وقتی که جستجو میکنید هیچ فرقی با خوندن کل اطلاعات نداره بقیه کارتون، فقط کوئری شما تفاوت داره

قبلا برای خوندن کل اطلاعات از جدول، آخرش where نمیذاشتید، حالا برای جستجو باید مشخص کنید چیو میخواین

درست متوجه شدم سوالتون رو ؟؟؟

hamedjj
شنبه 07 تیر 1393, 19:59 عصر
من داکیومنت این لایبری رو خوندم

به نظر من این لایبری واسه کسایی که با دیتابیس SQL کار نکردن ممکنه خیلی خوب باشه

اما اگر شما قبلا با دیتابیس کار کرده باشین، این لایبری یکم مسخره به نظر میرسه

همچنین این لایبری هنگام کار با دیتابیس آماده و از پیش ساخته شده، دیتابیس رو به صورت ساده دریافت میکنه

اما SQLite asset Helper دیتابیس رو زیپ شده میخونه که باعث میشه حجم برنامه پایین بمونه

آره منم خوندم مثل اینکه همین کاری که شما گفتید میکنه
بهتره از این لایبری استفاده نکنیم چون قدرت برنامه نویسی را میاره پایین

ali-star
شنبه 07 تیر 1393, 20:32 عصر
سلام

این کتابخونه کار خاصی غیر از باز کردن دیتابیس و آپدیت ارائه نمیده، اینکه اطلاعات رو جستجو کنید یا بخونید همش دیگه دست شماست

برای اینکه جستجو کنید باید بر اساس یک فیلد این کار رو انجام بدید دیگه، مثلا بگید سطرهایی رو انتخاب کن که فیلد نوع اونها برابر یه چیزی باشه

وقتی که جستجو میکنید هیچ فرقی با خوندن کل اطلاعات نداره بقیه کارتون، فقط کوئری شما تفاوت داره

قبلا برای خوندن کل اطلاعات از جدول، آخرش where نمیذاشتید، حالا برای جستجو باید مشخص کنید چیو میخواین

درست متوجه شدم سوالتون رو ؟؟؟

آره... بعضی نرم افزار ها رو دیدن که جستجو در متن دارن من هم میخوام یه قابلیت جستجو در متن در نرم افزارم قرار بدم....

civilroid
شنبه 07 تیر 1393, 21:13 عصر
سلام اساتید شما که انقد حرفه ای هستین من یه تایپک زدم راجب جستجو توی لیست ویو نگا کنید راهنماییم کنید ممنون ثواب داره:افسرده:

poorman
یک شنبه 08 تیر 1393, 00:53 صبح
سلام اساتید شما که انقد حرفه ای هستین من یه تایپک زدم راجب جستجو توی لیست ویو نگا کنید راهنماییم کنید ممنون ثواب داره:افسرده:

مطمئن باشید دوستان وقتی یک تاپیک جدید ایجاد میشه، اگر بتونن کمکی بکنن دریغ نمیکنن

من کدهای شما رو دیدم، یکم کدهاتون واضح نبود که دارید چکار میکنید، به همین خاطر نتونستم کمکی بکنم

بهتره شما بحث های مربوط به مشکلتون رو توی همون تاپیک دنبال کنید تا انشاالله حل بشه مشکلتون

parvizwpf
یک شنبه 08 تیر 1393, 02:38 صبح
حالا همه درباره همه چی صحبت کردند الا چی، سکوریتی. چه روشهایی برای سکوریت کردن دیتا داریم؟

poorman
یک شنبه 08 تیر 1393, 19:02 عصر
حالا همه درباره همه چی صحبت کردند الا چی، سکوریتی. چه روشهایی برای سکوریت کردن دیتا داریم؟

تا جایی که من خبر دارم، اگه خودمون رو هم بکشیم نمیشه صد درصد از دیتابیس محافظت کرد

در حالت عادی دیتابیس برنامه رو میشه به راحتی از توی DDMS بیرون کشید

برای دیتابیس من تا حالا ندیدم جایی رو که بشه پسوورد گذاشت

راه های حفاظت میتونه رمزنگاری داده ها باشه، اما خب باید دید این رمزنگاری و رمزگشایی در حین استفاده، سرعت کار رو پایین نمیاره آیا؟

mahnamnia
دوشنبه 09 تیر 1393, 12:30 عصر
باسلام
مشکلی در ذخیره اطلاعات به صورت html در sqlite دارم . میخوام کد های html را در قالب یک فیلد در جدول ذخیره کنم و بعد در اندروید در داخل webview نمایش بدم. اما مشکلم اینه که در بین متون html تصویر هم وجود داره و در واقع میخوام تگimg استفاده کنم اما نمیدونم چطور بایدبرا تصویر در داخل تگ img آدرس دهی کرد و تصویر را باید کجا ذخیره کرد که بعد داخل webview نمایش بده. ممنون میشم اگه منو راهنمایی کنید.

parvizwpf
دوشنبه 09 تیر 1393, 13:03 عصر
راه های حفاظت میتونه رمزنگاری داده ها باشه، اما خب باید دید این رمزنگاری و رمزگشایی در حین استفاده، سرعت کار رو پایین نمیاره آیا؟
خدایی منم هر جا نگاه کردم راهی صد در صد وجود نداره. چند وقت پیش نیاز مبرمی داشتم که دیتا رو ایمن کنم اما راهی پیدا نکردم. میگن وب سرویس بنویس. دیتام انقدر زیاد بود و ترتیب لودش انقدر زیاد بود مجبور بودم دیتا رو لوکال کنم. این cryptography هم احساس میکنم تو برنامه با دیای سیک جوابگو باشه. لامسب اندروید خیلی داغونه تو این زمینه تازه داره یه راهکارهایی می اندیشه. فکر کنم ios تو این زمینه موفق تر باشه.

poorman
دوشنبه 09 تیر 1393, 18:50 عصر
باسلام
مشکلی در ذخیره اطلاعات به صورت html در sqlite دارم . میخوام کد های html را در قالب یک فیلد در جدول ذخیره کنم و بعد در اندروید در داخل webview نمایش بدم. اما مشکلم اینه که در بین متون html تصویر هم وجود داره و در واقع میخوام تگimg استفاده کنم اما نمیدونم چطور بایدبرا تصویر در داخل تگ img آدرس دهی کرد و تصویر را باید کجا ذخیره کرد که بعد داخل webview نمایش بده. ممنون میشم اگه منو راهنمایی کنید.

سلام
دوست عزیز من در مورد وب ویو نمیتونم راهنمایی کنم

فک میکنم سوالتون مربوط به این تاپیک نباشه، بهتره توی یک تاپیک جدید سوالتون رو مطرح کنید تا دوستانی که اطلاع دارن کمکتون کنن

badname
پنج شنبه 12 تیر 1393, 16:31 عصر
سلام خسته نباشید همگی
برای اولین بار تصمیم گرفتم با دیتابیس کار کنم ، میخواستم ببینم برای خوندن و نمایش همچین دیتابیسی چجوری باید عمل کنم (از database asset helper استفاده کردم)
اینم کلاسم ساختم :
public class MyDatabase extends SQLiteAssetHelper {

private static final String DATABASE_NAME = "DataBaseName.db";
private static final int DATABASE_VERSION = 1;


public MyDatabase (Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
}
بقیه شو نمیدونم چجوری برم جلو :ناراحت: دوستان لطفا راهنمایی کنید تا حالا با دیتابیس کار نکردم

poorman
پنج شنبه 12 تیر 1393, 18:31 عصر
سلام

الان توی چیش مشکل داری شما؟

دیتابیس رو که ساختید دیگه، حالا طبق آموزشهای صفحه اول برید جلو دیتابیس رو زیپ کنید و توی مسیر asset/databases قرار بدید و بعدش هم طبق آموزش ازش استفاده کنید

همه چیز توی پست اول و پست مربوط به دیتابیس آماده توضیح داده شده که

نمونه برنامه های آماده هم میتونه کمکتون کنه توی نحوه کار با دیتابیس

badname
پنج شنبه 12 تیر 1393, 20:42 عصر
سلام

الان توی چیش مشکل داری شما؟

دیتابیس رو که ساختید دیگه، حالا طبق آموزشهای صفحه اول برید جلو دیتابیس رو زیپ کنید و توی مسیر asset/databases قرار بدید و بعدش هم طبق آموزش ازش استفاده کنید

همه چیز توی پست اول و پست مربوط به دیتابیس آماده توضیح داده شده که

نمونه برنامه های آماده هم میتونه کمکتون کنه توی نحوه کار با دیتابیس
والا خوندم اونارو ، گفتین برای خوندنش از
getReadableDatabase استفاده شه ولی من نمیدونم چطوری باید استفاده کنم ، مثلا یکی از مقادیر این دیتا بیس ام رو تو یه textview نشون بدم
بدونم چطوری میشه استفاده کرد دیگه تا تهش میرم :لبخندساده:

badname
پنج شنبه 12 تیر 1393, 21:28 عصر
آخر دیتابیس یاد نمیگیرم :ناراحت:

poorman
پنج شنبه 12 تیر 1393, 21:49 عصر
همین بالا 6-7 تا پست قبل تر من همین مثال رو برای یکی از دوستان زدم

http://barnamenevis.org/showthread.php?441406-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-SQLite-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-%D8%A8%D8%AF%D9%88%D9%86-%D9%86%DB%8C%D8%A7%D8%B2-%D8%A8%D9%87-%DA%A9%D9%84%D8%A7%D8%B3-DataBaseHelper&p=2050676&viewfull=1#post2050676

از نمونه برنامه های آماده استفاده کنین قشنگ دستتون میاد چکار کنین

توی این تاپیک هم کلی من مثال زدم

dasssnj
پنج شنبه 12 تیر 1393, 21:58 عصر
آخر دیتابیس یاد نمیگیرم :ناراحت:
منم قرار نبود یاد بگیرم . ولی یکی از رفیقام پیله کرد که یه برنامه ی رساله ی 14 مرجع بسازیم (خیلی خشکه مذهبی بود) و گفت باید برنامه نویسیش زود تموم شه آقا ما هم سفت چسبیدیم به دیتا بیس تا کامل یاد گرفتیم . اون رفیقمم آخرش به بهونه ی این که من دیکامپایل می کنم و حرامه و اینا دبه کرد و ما را گذاشت سر کار و پروژه را نصف کاره ول کرد.

حالا یه توصیه به شما دارم اونم اینه که برای یاد گیری انگیزه داشته باشید و یه چیزی را که می خواین یاد بگیرین محکم بچسبید و نگذارید چیز هایی مثل نمی تونم و اینا جلو تون را بگیره . سعی کنید منابع مربوط بهش را مطاله کنید . من اولین بار که کار با دیتابیس را دیدم فکر کردم خیلی سخته ولی حالا می بینم از خیلی کارا راحت تره و بیشتر وقتا ازش استفاده می کنم.
وقتی یه برنامه ی خیلی باحال می بینید نگید کاش برنامه ی منم مثل این بود فقط بگید کارمو کی شروع کنم . خدا بزرگه . امتحان کردم که میگم.

badname
پنج شنبه 12 تیر 1393, 22:21 عصر
والا بازم نتونستم :ناراحت:
این قضیه ش با بقیه چیزا فرق میکنه منم واسه خیلی چیزا تلاش میکنم تا یاد بگیرم و میگیرم اما رو بحث دیتا بیس حتی یه دیتای ساده از دیتا بیس ام نمی تونم نمایش بدم
فکر کنم کلا بد متوجه شدم هر چی ام سعی میکنم نمیشه :ناراحت:

poorman
جمعه 13 تیر 1393, 00:29 صبح
آخه من هرچی که توی چنته داشتم اینجا آموزش دادم دیگه

یعنی من هر کمکی که بخوام به شما بکنم، فقط بازگو کردن چیزایی هست که قبلا گفتم

دیگه این وظیفه شماست از چیزایی که گفته شده اینجا استفاده کنید

من یک توصیه میکنم، شما به دیتابیس آماده کار نداشته باش، پست اول این تاپیک آموزش ساخت دیتابیس درون برنامه و استفاده از اونه

شما از همون روش ابتدایی شروع کن و یاد بگیر، بعدش که پیشرفت بهتری داشتی کارای بزرگتر انجام بده

badname
جمعه 13 تیر 1393, 01:21 صبح
آخه من هرچی که توی چنته داشتم اینجا آموزش دادم دیگه

یعنی من هر کمکی که بخوام به شما بکنم، فقط بازگو کردن چیزایی هست که قبلا گفتم

دیگه این وظیفه شماست از چیزایی که گفته شده اینجا استفاده کنید

من یک توصیه میکنم، شما به دیتابیس آماده کار نداشته باش، پست اول این تاپیک آموزش ساخت دیتابیس درون برنامه و استفاده از اونه

شما از همون روش ابتدایی شروع کن و یاد بگیر، بعدش که پیشرفت بهتری داشتی کارای بزرگتر انجام بده
آره دقیقا به همین نتیجه رسیدم اول با همون آموزش اولی برم جلو بعد وارد این شم
بابت آموزشاتم ممنون ، خوب آموزش دادی منتحی من یچیزی اشتباه فهمیدم یا درست استفاده نمیکنم احتمالا ... یه دور برگردون بزنم از اول بیام شاید اوکی شد .:لبخندساده:

narvanco
شنبه 14 تیر 1393, 11:38 صبح
سلام دوستان
من تو یه دیتابیس 120 ردیف دارم
اونو تو لیست ویو فراخوانی میکنم.فقط 100 تاش میاد.چطور این مشکل رو حل کنم؟
ممنونم

alireza142
شنبه 14 تیر 1393, 13:06 عصر
من از لایبری sqlite asset helper استفاده میکنم که تو table خودم یه ستون به نام favorite دارم برای لیست علاقه مندی ها
مقادیر این table همه no هستند که میخوام باید با کلیک رو دکمه افزودن به yes تبدیل شود

برای این عمل باید چیکار کنم؟؟


در کلاس Adapter ای که ساختید ، درون متد getView ، این کد ها رو لازم دارید : ( البته در این مثال من از یک CheckBox برای این منظور استفاده کردم)
یک نمونه کد عالی هم جناب آقای poorman قرار دادن با عنوان " نمونه برنامه افزودن به علاقه مندی ها" که مسیرش این جاست :
http://barnamenevis.org/showthread.p...=1#post2016418


@Override
public View getView(final int position, View view, ViewGroup parent) {

LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.item, null, true);
CheckBox check_favotite = (CheckBox) rowView.findViewById(R.id.checkbox);

.
.
.


if (favorite [position].equals("no"))
favotite.setChecked(false);
else
favotite.setChecked(true);

favotite.setOnCheckedChangeListener(new OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
// TODO Auto-generated method stub
MyDatabase MyDatabase = new MyDatabase(context);
SQLiteDatabase mydb = MyDatabase.getWritableDatabase();
if (isChecked == true) {
mydb.execSQL("update list set like = 'yes' where id = " + ids[position]);
} else {
mydb.execSQL("update list set like = 'no' where id = "+ ids[position]);
}
mydb.close();
}
});

return rowView;
}

poorman
شنبه 14 تیر 1393, 18:17 عصر
سلام دوستان
من تو یه دیتابیس 120 ردیف دارم
اونو تو لیست ویو فراخوانی میکنم.فقط 100 تاش میاد.چطور این مشکل رو حل کنم؟
ممنونم

سلام

مطمئن هستید که رکوردهاتون 120 تا هست ؟؟؟

کدی که از دیتابیس میخونید رو بذارید تا ببینیم مشکل از کجاست

alireza142
شنبه 21 تیر 1393, 23:10 عصر
با سلام خدمت استاد خودم آقای poorman عزیز

طبق آموزش های شما بالاخره تونستم اطلاعات رو از یک بانک اطلاعاتی به لیست ویو بفرستم و نمایش بدم.
اما یه مشکل کوچیک وجود داره. هر بار که برنامه رو میبندم و دوباره اجراش می کنم(در گوشی موبایلم) ، تعداد عناصر قبلی در لیست ویو، دو برابر میشه. یعنی همون عناصر قبلی مجددا تکرار میشن!!!
اشکال از کدوم قسمت کد من هستش؟
بازم بابت پاسخ های قشنگتون ممنونم.



public class MainActivity extends Activity {

SQLiteDatabase mydb;
private static String DBNAME = "PERSONS";
private static String TABLE = "MY_TABLE";


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


ListView listView = (ListView) findViewById(R.id.listView1);


mydb = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE, null);
mydb.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE + " (ID INTEGER PRIMARY KEY, NAME TEXT, AGE INTEGER)");
mydb.execSQL("INSERT INTO " + TABLE + " ( NAME , AGE ) VALUES ('Ali', 21)");
mydb.close();


mydb = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE, null);


Cursor allrows = mydb.rawQuery("SELECT * FROM " + TABLE, null);


String[] NAME = new String[allrows.getCount()];
int i = 0;
if (allrows.moveToFirst()) {
do {
NAME[i] = allrows.getString(1);
i++;
} while (allrows.moveToNext());


allrows.close();
mydb.close();


ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, android.R.id.text1, NAME);


listView.setAdapter(adapter);
}


}

poorman
شنبه 21 تیر 1393, 23:51 عصر
سلام

تشکر از لطفت آقا علیرضا

شما هر بار که برنامه رو اجرا میکنی، یک بار داری اطلاعات رو داخل جدول insert میکنی

به همین دلیل به ازای هر بار اجرای برنامه یک رکورد اضافه میشه

دو تا راه وجود داره، یکی اینکه مثلا یک دکمه باشه توی برنامه که با زدن اون اطلاعات به دیتابیس اضافه بشه

یا قبل از اضافه شدن تعداد سطرهای داخل جدول رو چک کنید که اگر خالی بود insert کنه اگر نه کاری نکنه

cursor c = mydb.rawQuery("select * from yourTable");
if(c.getCount() == 0){
//insert into table
}

davoodi
دوشنبه 23 تیر 1393, 12:33 عصر
سلام استاد.
استاد در پروژه ام نیاز دارم بخشی رو به عنوان علاقه مندی ایجاد کنم.
همه کارها رو انجام دادم اما نمیدونم چرا وقتی از execSql استفاده میکنم برنامه کلوز میشه.
این ها هم کدهام هستن :



public void favoriteManage(View v){
MyData = new MyDatabase(this);
mydb = MyData.getReadableDatabase();
Cursor row = mydb.rawQuery("SELECT * FROM food "
+ " WHERE food.ID_Food = " + FoodID, null);
row.moveToFirst();
int getFav = row.getInt(row.getColumnIndex("Favorite"));

mydb = MyData.getWritableDatabase();
switch (getFav) {
case 1:
mydb.execSQL("UPDATE food SET Favorite = 0 WHERE ID_Food = 1", null);
btnFavorite.setBackgroundResource(R.drawable.fav_o ff);
Toast.makeText(getBaseContext(), ".از علاقه مندی ها حذف گردید", Toast.LENGTH_LONG).show();
break;
case 0:

mydb.execSQL("UPDATE food SET Favorite = 1 WHERE ID_Food = 1", null);
btnFavorite.setBackgroundResource(R.drawable.fav_o n);
Toast.makeText(getBaseContext(), "به علاقه مندی ها اضافه گردید.", Toast.LENGTH_LONG).show();
break;
default:
break;
}
}



ممنونم :چشمک::لبخندساده:

مثل اینکه insert هم کار نمیکنه!!!
این هم فایل mydatabse.java است :


public class MyDatabase extends SQLiteAssetHelper{

private static final String DATABASE_NAME = "mydbs.db";
private static final int DATABASE_VERSION = 1;

public MyDatabase (Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}



}






حل شد.
باید NULL رو از انتهای دستور آپدیت در execSQL بر میداشتم.
ممنون.

smemamian
دوشنبه 30 تیر 1393, 01:24 صبح
سلام
مشکل:
یه ستون بسازید مثلاً به اسم id ، و به صورت خودکار افزایشی (AI) و همچنین NOT NULL قرار بدین.
در این صورت برنامه اصلاً اطلاعات رو نمیخونه !
تست کنید ببینید واسه شما هم اینطور هست یا نه.
راه حل:
برنامه رو باید ابتدا از گوشی پاک کنید!!!

poorman
دوشنبه 30 تیر 1393, 12:12 عصر
سلام
مشکل:
یه ستون بسازید مثلاً به اسم id ، و به صورت خودکار افزایشی (AI) و همچنین NOT NULL قرار بدین.
در این صورت برنامه اصلاً اطلاعات رو نمیخونه !
تست کنید ببینید واسه شما هم اینطور هست یا نه.
راه حل:
برنامه رو باید ابتدا از گوشی پاک کنید!!!

!!!!!!!

یعنی چی ؟؟؟ به هیچ عنوان به چنین مشکلی برنخوردم تا حالا

البته یک نکته که من جایی خوندم این بود که توی دیتابیس آماده تمام مقادیر id رو به id_ تغییر بدید

ولی اینکه میگید بعد از پاک کردن برنامه مشکل حل میشه، حدس میزنم مشکل مال ورژن دیتابیس برنامتون باشه، یعنی شما بعد از اینکه روی دیتابیس برنامتون تغییراتی میدید ورژن رو اضافه نمیکنید تا دیتابیس خودش رو آپدیت کنه

روش افزایش ورژن دیتابیس و آپدیت دیتابیس اینجا (http://barnamenevis.org/showthread.php?441406-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-SQLite-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-%D8%A8%D8%AF%D9%88%D9%86-%D9%86%DB%8C%D8%A7%D8%B2-%D8%A8%D9%87-%DA%A9%D9%84%D8%A7%D8%B3-DataBaseHelper&p=1989704&viewfull=1#post1989704)گفته شده

narvanco
شنبه 04 مرداد 1393, 13:51 عصر
دوستان تو این تصویر خطا در دیتابیس منه یا در کدها و روش نوشتن ساخت دیتابیس در کلاس؟
121570

poorman
یک شنبه 05 مرداد 1393, 20:40 عصر
سلام

مشکل از جدول SQLite شماست و یا کوئری که دارید مینویسید

شما داخل کوئری تون اومدید ستون های آیدی، عنوان، ... و sub رو select کردید

این خطا داره میگه ستونی به اسم sub توی جدولتون ندارید

ممکنه شما این ستون رو داشته باشید، اما فایل دیتابیس پروژتون رو آپدیت نکرده باشید

به هرحال یا باید این ستون وجود داشته باشه، یا اینکه شما این ستون رو از توی کوئری حذف کنید

narvanco
دوشنبه 06 مرداد 1393, 03:23 صبح
سلام

مشکل از جدول SQLite شماست و یا کوئری که دارید مینویسید

شما داخل کوئری تون اومدید ستون های آیدی، عنوان، ... و sub رو select کردید

این خطا داره میگه ستونی به اسم sub توی جدولتون ندارید

ممکنه شما این ستون رو داشته باشید، اما فایل دیتابیس پروژتون رو آپدیت نکرده باشید

به هرحال یا باید این ستون وجود داشته باشه، یا اینکه شما این ستون رو از توی کوئری حذف کنید


ممنونم دوست من.
من ستون sub رو اضاقه کردم به دیتابیس و بعد اومدم دستور جدید رو که در پایان ساخت sqlite میده رو به پروژه آوردم و قسمت sub رو اضاقه کردم..الان تو دیتابیس sub داره تو پروژه هم sub معرفی شده..اما فکر میکنم اینکه اومدم یه ستون یه دیتابیس اضاقه کردم خراب شده باشه.درسته؟
آقا جکار میتونیم بکنم؟یه دیتابیس زیادیه.او چیزی که فرمودید آپدیت نکردم چطوری باید این کار رو بکنم؟
خیلی ممنونم ازتون

عذر میخوام به سوال هم از محضر شما در این بخش (http://barnamenevis.org/showthread.php?449045-%DA%86%D8%B7%D9%88%D8%B1%DB%8C-%D9%87%D9%85%DA%86%DB%8C%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%B2%DB%8C%D8%A8%D8%A7%DB%8C%DB%8C-%D9%85%DB%8C%D8%B3%D8%A7%D8%B2%D9%86%D8%AF&p=2070617&viewfull=1#post2070617) کردم.ممنون میشم جواب بدید لطفا.

poorman
دوشنبه 06 مرداد 1393, 04:10 صبح
ممنونم دوست من.
من ستون sub رو اضاقه کردم به دیتابیس و بعد اومدم دستور جدید رو که در پایان ساخت sqlite میده رو به پروژه آوردم و قسمت sub رو اضاقه کردم..الان تو دیتابیس sub داره تو پروژه هم sub معرفی شده..اما فکر میکنم اینکه اومدم یه ستون یه دیتابیس اضاقه کردم خراب شده باشه.درسته؟
آقا جکار میتونیم بکنم؟یه دیتابیس زیادیه.او چیزی که فرمودید آپدیت نکردم چطوری باید این کار رو بکنم؟
خیلی ممنونم ازتون

عذر میخوام به سوال هم از محضر شما در این بخش (http://barnamenevis.org/showthread.php?449045-%DA%86%D8%B7%D9%88%D8%B1%DB%8C-%D9%87%D9%85%DA%86%DB%8C%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%B2%DB%8C%D8%A8%D8%A7%DB%8C%DB%8C-%D9%85%DB%8C%D8%B3%D8%A7%D8%B2%D9%86%D8%AF&p=2070617&viewfull=1#post2070617) کردم.ممنون میشم جواب بدید لطفا.

این اضافه کردن ستون و اینا رو متوجه نشدم دقیقا چکار کردید

اما مهم اینه که فایل دیتابیس شما با چیزی که دارید کدش رو مینویسید همخونی داشته باشه

شما دارید از لایبری دیتابیس آماده استفاده میکنید؟ اگر آره، این لایبری یک خاصیت داره که اگر تغییری توی دیتابیس بدید باید یکی به ورژن اضافه کنید و یک خط کد رو توی کلاس MyDatabase اضافه کنید که توی صفحه اول همین تاپیک، تقریبا پست های آخر توضیح داده شده

حالا به هرحال قضیه اینجاست که تا ورژن بالا نره، برنامه از دیتابیس قبلی که قبلا توی دیوایس کپی شده استفاده میکنه

راه ساده اینه که شما برید داخل ایمولاتور، قسمت تنظیمات، بعد مدیریت برنامه ها یا app manager و بعد توی قسمت برنامتون، دیتا رو پاک کنید clear data

دیگه اینطوری وقتی دیتابیسی توی دیوایس نباشه، برنامه مجبور میشه فایل دیتابیس رو دوباره کپی کنه

scofield
دوشنبه 06 مرداد 1393, 21:16 عصر
دوستان یه سوال
چطوری میشه در دیتابیس بر اساس فیلدی بجز id انتخلب رو انجام داد ؟؟؟
خیلی برام عجیبه کد اول درسته ولی کد دومی خطا میده !!
Cursor cursor = mDataBase.rawQuery("SELECT FROM L1 WHERE ID = 1" , null);
Cursor cursor = mDataBase.rawQuery("SELECT FROM L1 WHERE name = ali" , null);

ممنون

poorman
سه شنبه 07 مرداد 1393, 00:20 صبح
دوستان یه سوال
چطوری میشه در دیتابیس بر اساس فیلدی بجز id انتخلب رو انجام داد ؟؟؟
خیلی برام عجیبه کد اول درسته ولی کد دومی خطا میده !!
Cursor cursor = mDataBase.rawQuery("SELECT FROM L1 WHERE ID = 1" , null);
Cursor cursor = mDataBase.rawQuery("SELECT FROM L1 WHERE name = ali" , null);

ممنون

خب دوستان لطف کردن توی تاپیکی که جداگانه ساختید جواب دادن

من فقط لینک جواب رو میذارم که اگر کسی این مشکل رو داشت به جواب برسه

http://barnamenevis.org/showthread.php?462681-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%A8%D8%B1-%D8%A7%D8%B3%D8%A7%D8%B3-%D9%81%DB%8C%D9%84%D8%AF%DB%8C-%D8%A8%D8%AC%D8%B1-id&p=2071431&viewfull=1#post2071431

mdibmehr2
سه شنبه 07 مرداد 1393, 09:04 صبح
ببخشید بنده یه لیست ویو به زبان html دارم . می شه براش به وسیله دیتابیس قسمت علاقه مندی ها گذاشت ؟ یعنی آیتم از لیست ویو که انتخاب شد بره داخل یه صفحه دیگه و اونجا به علاقه مندی های کاربر اضافه شه . با تشکر

poorman
پنج شنبه 09 مرداد 1393, 22:40 عصر
ببخشید بنده یه لیست ویو به زبان html دارم . می شه براش به وسیله دیتابیس قسمت علاقه مندی ها گذاشت ؟ یعنی آیتم از لیست ویو که انتخاب شد بره داخل یه صفحه دیگه و اونجا به علاقه مندی های کاربر اضافه شه . با تشکر

سلام

متاسفانه من با زبان HTML و کار با دیتابیس در اون آشنا نیستم

این آموزش ها مربوط به زبان جاوا و اکلیپس هست، سوالی توی زبان جاوا داشتید در خدمتم

haniiii
چهارشنبه 22 مرداد 1393, 01:59 صبح
سلام دوستان

برای افزایش سرعت insert چه راه هایی وجود داره ؟

من مشابه اینجا (http://www.androidhive.info/2013/09/android-sqlite-database-with-multiple-tables/) insert میکنم و سایر کار ها

samira1366
پنج شنبه 30 مرداد 1393, 22:47 عصر
فیلم آموزش ASP.Net به زبان فارسی از مقدماتی تا پیشرفته را از لینکهای زیر دانلود کنید


http://banke-maghalat.ir/images/image/download.gif قسمت اول (http://cld.persiangig.com/download/uTUNnQWZeb/j1_ASP.Net_Banke-maghalat.ir.rar/dl)

http://banke-maghalat.ir/images/image/download.gif قسمت دوم
(http://cld.persiangig.com/download/DOFKay4V8G/j2_ASP.Net_Banke-maghalat.ir.rar/dl)
http://banke-maghalat.ir/images/image/download.gif قسمت سوم (http://cld.persiangig.com/download/gKg2eYubFE/j3_ASP.Net_Banke-maghalat.ir.rar/dl)

hamishebahar1
یک شنبه 09 شهریور 1393, 11:31 صبح
آموزش کار با دیتابیس آماده SQLite

برای ساخت یک دیتابیس خارجی و آماده نرم افزار SQLite Database Browser (http://sourceforge.net/projects/sqlitebrowser/)رو پیشنهاد میکنم

نمونه کار با دیتابیس آماده و نمایش و آپدیت اطلاعات دیتابیس رو از این پست (http://barnamenevis.org/showthread.php?401729-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF&p=2016418&viewfull=1#post2016418)دریافت کنید

-----------------------------------------------------------------------------------------------

بالاخره من دیشب تونستم تمام مشکلات مربوط به دیتابیس آماده رو حل کنم و ارتباط خوبی برقرار کنم با لایبری
sqlite asset helper

( با تشکر از hamedjj به خاطر پافشاری روی استفاده از این لایبری )
ولی خب استفاده از این لایبری هم یکم برام گیج کننده بود که خدا رو شکر تونستم آخرش راه بندازمش
من یه توضیح میدم واسه کسایی که میخوان با دیتابیس آماده کار کنن و مثل من به مشکل خوردن

انصافا استفاده از sqlite asset helper راحته و بسیار کارا
یکی از مشکلاتی که من برخورد کردم توی استفاده از کلاس های دیگه، این بود که توی اندروید 10 به پایین دیتابیس رو ایجاد نمیکرد ولی این لایبری مشکل رو حل کرد

خب دوستانی که با اکلیپس کار میکنن این فایل jar رو دانلود کنن و توی پروژه مورد نظر در پوشه libs قرار بدن

لینک فایل jar (http://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=com.readystatesoftware.sqliteasset&a=sqliteassethelper&v=LATEST&&c=jar)

توی پوشهassets یک پوشه به اسم databases بسازید

بعد دیتابیس خودتون رو zip کنید ( فایل دیتابیس به تنهایی باید پسوند .db داشته باشه )

فایل زیپ شده رو با فرمت اسم ( DataBaseName.db.zip ) توی پوشه databases بذارید. ( دقت کنید باید هم پسوند db هم پسوند zip داشته باشه )

یعنی نمایش فایل زیپ توی ویندوز به صورت DataBaseName.db و نمایش توی اکلیپس به شکل DataBaseName.db.zip باشه

بعدش این کلاس رو ایجاد کنین




public class MyDatabase extends SQLiteAssetHelper {

private static final String DATABASE_NAME = "DataBaseName.db";
private static final int DATABASE_VERSION = 1;

public MyDatabase (Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
}



توی کلاسی که ایجاد کردین اسم دیتابیس خودتون رو با پسوند db وارد کنین

بعدش توی اکتیویتی توی متغیرهای عمومی یک نمونه از این کلاس تعریف کنید، به این صورت :
private MyDatabase MyDataBase;

و بعد توی متد onCreate این خط کد رو بنویسین :
MyDataBase = new MyDatabase(this);

حالا هر جایی که خواستین دیتابیس رو باز کنین، میتونین از دو تا حالت getWritableDatabase() و getReadableDatabase() که برای خوندن و نوشتن هست استفاده کنین
به صورت زیر مثلا :

mydb = MyDataBase.getReadableDatabase();

وقتی getReadableDatabase استفاده میکنید، فقط عملیات خواندن رو میتونید انجام بدید

پس برای نوشتن یا آپدیت و دیلت باید از getWritableDatabase استفاده کنید

به همین سادگی، فقط باید تمام این مراحل رو به ترتیب و همینطور که گفتم انجام بدید که به مشکل نخورید
( zip کردن دیتابیس برای اینه که توی اندروید 10 به پایین خطا نگیرید )

آموزش کار با دیتابیس ( خواندن، نوشتن، آپدیت و دیلت ) توی همین تاپیک قرار داده شده

لطفا بعد از مطالعه درصورت وجود مشکل سوال بپرسید در خدمتم

----------------------------------------------------------------------------------------------

برای آپدیت کردن اطلاعات دیتابیس آماده به این پست (http://barnamenevis.org/showthread.php?441406-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-SQLite-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-%D8%A8%D8%AF%D9%88%D9%86-%D9%86%DB%8C%D8%A7%D8%B2-%D8%A8%D9%87-%DA%A9%D9%84%D8%A7%D8%B3-DataBaseHelper&p=1989704&viewfull=1#post1989704)مراجعه کنید

اگر مفید واقع شد، دکمه تشکر این پایینه :لبخند:


ببخشید فایل sqliteبا پسوند sqlite. ذخیره میشه و وقتی پسوندش و تبدیل به db.میکنم،نمیشناسه و حتی موقع زیپ کردن این پسوند و نادیده می گیره ، باید چیکار کنم ؟

poorman
یک شنبه 09 شهریور 1393, 12:05 عصر
از برنامه ای که برای کار با دیتابیس آماده معرفی کردم استفاده کنید، من با برنامه های دیگه کار نکردم و توی مسائل فرمت ذخیره کردنشون اطلاعی ندارم

id1385
یک شنبه 09 شهریور 1393, 22:31 عصر
برای کار با پایگاه داده یک کلاس نوشتم که می تونید در تایپیک زیر ببینید
http://barnamenevis.org/showthread.php?465919-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7&p=2087129&viewfull=1#post2087129

موفق باشید

**nastaran**
دوشنبه 10 شهریور 1393, 11:04 صبح
سلام

کاری نداره شما باید برای کوئری فقط یک شرط بذارید تا اطلاعات اون سطر رو برگردونه

بعدش با اطلاعات هر کاری خواستی میکنی، اینجا چون میدونم فقط یک سطر جواب داریم، نیاز به حلقه تکرار و آرایه نیست دیگه

Cursor allrows = mydb.rawQuery("SELECT * FROM "+ TABLE + " where _id = 3", null);

if(allrows.moveToFirst()){
textView.setText(allrows.getString(1));
}
allrows.close();
mydb.close();



توی این مثال تمام ستون های سطری که فیلد _id اون برابر 3 هست انتخاب میشن، و بعد مثلا محتوای ستون دوم ( ایندکس 1 ) داخل تکست ویو نمایش داده میشه

سلام به همه دوستان .میشه لطف کنید بگید چرا من با نوشتن این کدها چیزی در برنامم نوشته نمیشه با اینکه خطایی نمیدهد و می گوید دیتابیس باز شده است ولی متنی نمایش داده نمیشود .

;(MyDataBase= new MyDatabase(this

;()mydb = MyDataBase.getReadableDatabase
;(Cursor cursor= mydb.rawQuery("SELECT * FROM "+ TABLE, null
;()cursor.moveToFirst
;((txt.setText( cursor.getString(3
;()cursor.close
;()mydb.close

poorman
دوشنبه 10 شهریور 1393, 13:25 عصر
سلام به همه دوستان .میشه لطف کنید بگید چرا من با نوشتن این کدها چیزی در برنامم نوشته نمیشه با اینکه خطایی نمیدهد و می گوید دیتابیس باز شده است ولی متنی نمایش داده نمیشود .

;(MyDataBase= new MyDatabase(this

;()mydb = MyDataBase.getReadableDatabase
;(Cursor cursor= mydb.rawQuery("SELECT * FROM "+ TABLE, null
;()cursor.moveToFirst
;((txt.setText( cursor.getString(3
;()cursor.close
;()mydb.close




مطمئن هستید داخل ستونتون چیزی وجود داره ؟ من حدس میزنم داخل ستونی که دارید اطلاعاتش رو میخونید چیزی نیست

ایندکس 3 که شما نوشتید میشه ستون چهارم جدولتون ( ممکنه به این دقت نکرده باشید )

از این کد استفاده کنید تا دقیقا مقدار همون ستونی که میخواید رو بگیرید و مطمئن بشید اون ستون مقدار داره

txt.setText( cursor.getString(cursor.getColumnIndex("columnName")));

**nastaran**
دوشنبه 10 شهریور 1393, 14:21 عصر
ممنون از پاسختون
بله مقدار دارد ولی ستون چهارمم مقدار عددی بود الان ایندکس رو 2 هم گذاشتم که مربوط به ستون متنی بود باز هم چیزی نمی نویسد حتی از این دستور هم گفتید استفاده کردم و به جای آن "name" نوشتم که مربوط به یکی از ستونهایم بود ولی باز هم خروجی ندارد.عکس دیتابیس رو هم براتون گذاشتم
122959

poorman
دوشنبه 10 شهریور 1393, 15:09 عصر
شاید شما دیتابیستون رو آپدیت نکردید توی برنامه

احتمال داره اول که دیتابیس رو ساختید خالی بوده و بعد اطلاعات رو توش وارد کردید و گذاشتید توی پوشه asset اما یادتون رفته توی کلاس myDatabase ورژن رو یکی اضافه کنید و خط setForcedUpgrade() رو به تابع myDatabase توی همون کلاس اضافه کنید

درصد زیادی احتمال داره که برنامه داره از دیتابیس قبلی استفاده میکنه

یا دیتابیس برنامه رو از توی ایمولاتور -> تنظیمات -> برنامه ها -> اسم برنامه -> clear data پاک کنید

یا اینکه به روشی که گفتم دیتابیس رو آپدیت کنید

**nastaran**
دوشنبه 10 شهریور 1393, 15:23 عصر
شاید شما دیتابیستون رو آپدیت نکردید توی برنامه

احتمال داره اول که دیتابیس رو ساختید خالی بوده و بعد اطلاعات رو توش وارد کردید و گذاشتید توی پوشه asset اما یادتون رفته توی کلاس myDatabase ورژن رو یکی اضافه کنید و خط setForcedUpgrade() رو به تابع myDatabase توی همون کلاس اضافه کنید

درصد زیادی احتمال داره که برنامه داره از دیتابیس قبلی استفاده میکنه

یا دیتابیس برنامه رو از توی ایمولاتور -> تنظیمات -> برنامه ها -> اسم برنامه -> clear data پاک کنید

یا اینکه به روشی که گفتم دیتابیس رو آپدیت کنید

خیلی ممنون از پاسختون مشکلم همین بود و الان برطرف شد :لبخندساده:

narvanco
پنج شنبه 13 شهریور 1393, 13:16 عصر
دوستان
وقتی در دیتابیس متون عربی نوشته میشه و میخوام اونو در تکست ویو بیارم ، حرکات بهم ریخته میشه و خیلی نزدیک به حرف ها قرار میگیرن.
مشکل چی میتونه باشه؟
خیلی ممنون

poorman
پنج شنبه 13 شهریور 1393, 14:08 عصر
دوستان
وقتی در دیتابیس متون عربی نوشته میشه و میخوام اونو در تکست ویو بیارم ، حرکات بهم ریخته میشه و خیلی نزدیک به حرف ها قرار میگیرن.
مشکل چی میتونه باشه؟
خیلی ممنون

سلام

مشکل از دیتابیس نیست، مشکل از فونت شماست یا اینکه اگر از کلاس های فارسی ساز استفاده میکنید، مشکل از اوناست

mz6488
دوشنبه 24 شهریور 1393, 14:25 عصر
سلام.با تشکر از مطلب خوبتون.می خوام به دیتابیس برنامه م موقع اجرا دسترسی داشته باشم.باید چکار کنم؟

poorman
دوشنبه 24 شهریور 1393, 15:33 عصر
سلام.با تشکر از مطلب خوبتون.می خوام به دیتابیس برنامه م موقع اجرا دسترسی داشته باشم.باید چکار کنم؟ سلام، ممنون متوجه منظورتون نشدم، یعنی چی میخواین موقع اجرا به دیتابیس دسترسی داشته باشید؟ این مطالبی که آموزش دادم همه درباره اینه که در حین اجرا یک سری عملیاتی رو با دیتابیس انجام بدید، از دیتابیس بخونید، بنویسید و ... اگر چیز دیگه ای منظورتون هست، بیشتر توضیح بدید

mz6488
دوشنبه 24 شهریور 1393, 15:44 عصر
سلام، ممنون متوجه منظورتون نشدم، یعنی چی میخواین موقع اجرا به دیتابیس دسترسی داشته باشید؟ این مطالبی که آموزش دادم همه درباره اینه که در حین اجرا یک سری عملیاتی رو با دیتابیس انجام بدید، از دیتابیس بخونید، بنویسید و ... اگر چیز دیگه ای منظورتون هست، بیشتر توضیح بدید

من دیتابیس جدید رو تو sdCard می ذارم.می خوام که دیتابیس رو از sdCard کپی کنم و جایگزین دیتابیس قبلی کنم که فکر کنم تو پوشه data ذخیره میشه.ولی نمیتونم بهش دسترسی داشته باشم.
اینم بگم که بنا به دلایلی می خوم دیتابیس رو جایگزین کنم(هر دفعه فقط دیتابیس رو میذارم تو sdCard).امیدوارم متوجه منظورو شده باشین هر چند عجیب غریبه ولی به شدت نیازش دارم

poorman
دوشنبه 24 شهریور 1393, 20:24 عصر
من دیتابیس جدید رو تو sdCard می ذارم.می خوام که دیتابیس رو از sdCard کپی کنم و جایگزین دیتابیس قبلی کنم که فکر کنم تو پوشه data ذخیره میشه.ولی نمیتونم بهش دسترسی داشته باشم.
اینم بگم که بنا به دلایلی می خوم دیتابیس رو جایگزین کنم(هر دفعه فقط دیتابیس رو میذارم تو sdCard).امیدوارم متوجه منظورو شده باشین هر چند عجیب غریبه ولی به شدت نیازش دارم

متاسفانه فکر نکنم بتونم توی این زمینه راهنمایی کنم، تجربه ای ندارم توی این قسمت

zikimiki
سه شنبه 25 شهریور 1393, 01:03 صبح
سلام استاد poorman (http://barnamenevis.org/member.php?295320-poorman) خسته نباشید.
متن تونستم یک جستجو در متن بسازم که متن ها رو از دیتا بیس می گیره.ولی من می خوام جستجو به صورت هایلایت و با نمایش متن مورد جستجو انجام بگیره.برای این کار چیکار باید بکنم. (در جستجویی که من دارم صرفا سر تیر موضوع رو نشون میده و متن های اصلی که کلمه مورد نظر در اون هست نشون داده نمی شه.
می خوا یه چیزی مثل عکس پایین بشه.
با تشکر و سپاس از شما.

http://s.cafebazaar.ir/1/upload/screenshot/mavara.laws.speciallegal2.jpg

narvanco
سه شنبه 25 شهریور 1393, 22:05 عصر
سلام .
من میخوام برنامه وقتی آپدیت میشه لازم نباشه که قبلی رو حذف کنیم و خودش عمل حذف رو انجام بده.
از دستوراتی که نوشته بودید استفاده کردم اما نشد.
کد اون بخش رو میزارم لطفا راهنماییم کنید.
متشکرم

public DBAdapter(Context ctx) {
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
// DATABASE_VERSION = 1
super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(CREATE_TABLE);
} catch (SQLException e) {
e.printStackTrace();
}
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");

db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
onCreate(db);
}
}[/JAVA][/JAVA][/JAVA][/JAVA]

mojniknam
دوشنبه 31 شهریور 1393, 08:51 صبح
سلام
من از روی نمونه کدی که گذاشته بودید لیستی درست کردم و برنامه بدون مشکل اجرا میشه و اطلاعات رو نشون میده
اما:
وقتی دکمه fav رو میزنم و از اکتیویتی بیرون میرم و برمیگردم ، تغییرات اعمال نشده
بلافاصله بعد از کد sql update یک toast گذاشتم و وضعیت fav رو چک کردم و دیدم تغییرات اعمال نمیشه
دستور sql update رو جداگانه در sqlite اجرا کردم ولی مشکلی نداشت و تغییرات رو اعمال می کنه

favotite.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
MyDatabase MyDatabase = new MyDatabase(context);
SQLiteDatabase mydb = MyDatabase.getWritableDatabase();
if(isChecked == true) {
mydb.execSQL("update [main].[tb_book] set fav = '1' where ID = " + ID[position]);
Toast.makeText(getContext(), "fav=1 / favpos:"+fav[position]+" / idpos:"+ID[position], 1000).show();
} else {
mydb.execSQL("update [main].[tb_book] set fav = 0 where ID = " + ID[position]);
Toast.makeText(getContext(), "fav=0"+position, 1000).show();
}
mydb.close();
}

});

saeed_g21
دوشنبه 31 شهریور 1393, 08:56 صبح
وقتی دکمه fav رو میزنم و از اکتیویتی بیرون میرم و برمیگردم ، تغییرات اعمال نشده
بلافاصله بعد از کد sql update یک toast گذاشتم و وضعیت fav رو چک کردم و دیدم تغییرات اعمال نمیشه

یعنی هیچ Toastی نشان داده نمیشه ؟
در این حالت مشکل از شرطی که قراردادین میتونه باشه


دستور sql update رو جداگانه در sqlite اجرا کردم ولی مشکلی نداشت و تغییرات رو اعمال می کنه
فقط Query بروزرسانی رو اجرا کردین بدون شرط ؟

mojniknam
دوشنبه 31 شهریور 1393, 09:21 صبح
toast رو نشون میده ولی مقدار فیلد fav رو 0 نشون میده درحالیکه در یک خط قبلش با sql update اون رو 1 کردیم
query:
update [main].[tb_book] set fav = 1 where ID = 1;

saeed_g21
دوشنبه 31 شهریور 1393, 09:28 صبح
toast رو نشون میده ولی مقدار فیلد fav رو 0 نشون میده درحالیکه در یک خط قبلش با sql update اون رو 1 کردیم
query:
update [main].[tb_book] set fav = 1 where ID = 1;

درسته یک کردین ولی گفتین اگه isChecked مساوی true باشه اینکار رو کنه و در else گفتین در غیر اینصورت اینکار رو کنه که اون Toast همون قسمت Else شرط است!
پس با این حساب شما چیزی رو 1 نکردین


ببین مقدار isChecked چی هست ؟
Toast.makeText(getContext(), ""+isChecked, 1).show();

mojniknam
دوشنبه 31 شهریور 1393, 09:51 صبح
من توی هر دو قسمت شرط toast گذاشتم
favotite.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
MyDatabase MyDatabase = new MyDatabase(context);
SQLiteDatabase mydb = MyDatabase.getWritableDatabase();
if(isChecked == true) {
mydb.execSQL("update [main].[tb_book] set fav = 1 where ID = " + ID[position]);
Toast.makeText(getContext(), "fav=1 / favDB:"+fav[position], 1000).show();
} else {
mydb.execSQL("update [main].[tb_book] set fav = 0 where ID = " + ID[position]);
Toast.makeText(getContext(), "fav=0 / favDB:"+fav[position], 1000).show();
}
mydb.close();
}
});

خط 6 میگه: روی دکمه fav که کلیک شده اگه true شده بنابراین .......
خط 7 میگه: اگه true بود توی دیتابیس fav رو 1 کنه
خط 8 میگه: toast رو نشون بده که مقدار fav در دیتا بیس چنده (که برای من نشون میده 0)
خط 9: در غیر اینصورت (اگه پس از کلیک کردن روی دکمه fav برابر با false شده باشه)
خط 10: توی دیتابیس fav رو 0 کنه
خط 8 میگه: toast رو نشون بده که مقدار fav در دیتا بیس چنده (که برای من نشون میده 0)

saeed_g21
دوشنبه 31 شهریور 1393, 10:15 صبح
منظورم رو نگرفتی

ببین اصلا متن Toast هارو یه چیزه دیگه کن مثل هم نباشند دوباره تست بزنی میبینی فقط قسمت else شرط برات اجرا میشه

روی خط 6 Breakpoints بزار و debug رو بزن تا اجرا شه (run نزنی) میبینی به اون خط که رسید میپره به else دستور

mojniknam
دوشنبه 31 شهریور 1393, 10:26 صبح
شرط درست اجرا میشه
متن toast هم متفاوته (اول یکیش fav=1 نوشته و اول یکی دیگه اش fav=0 نوشته)
یک نکته ای که شاید اهمیت داشته باشه اینه که fav از نوع integer هست

poorman
دوشنبه 31 شهریور 1393, 12:23 عصر
سلام استاد poorman (http://barnamenevis.org/member.php?295320-poorman) خسته نباشید.
متن تونستم یک جستجو در متن بسازم که متن ها رو از دیتا بیس می گیره.ولی من می خوام جستجو به صورت هایلایت و با نمایش متن مورد جستجو انجام بگیره.برای این کار چیکار باید بکنم. (در جستجویی که من دارم صرفا سر تیر موضوع رو نشون میده و متن های اصلی که کلمه مورد نظر در اون هست نشون داده نمی شه.
می خوا یه چیزی مثل عکس پایین بشه.
با تشکر و سپاس از شما.

http://s.cafebazaar.ir/1/upload/screenshot/mavara.laws.speciallegal2.jpg

سلام

این چیزی که میخواین پیاده سازی کنید ارتباطی به دیتابیس نداره
بعد از اینکه جستجو رو انجام دادید، موقع نمایش باید این مورد پیاده سازی بشه

یعنی توی نتایجی که به دست اومده، هرجایی که اون کلمه وجود داره رو هایلایت کنید

poorman
دوشنبه 31 شهریور 1393, 12:26 عصر
سلام .
من میخوام برنامه وقتی آپدیت میشه لازم نباشه که قبلی رو حذف کنیم و خودش عمل حذف رو انجام بده.
از دستوراتی که نوشته بودید استفاده کردم اما نشد.
کد اون بخش رو میزارم لطفا راهنماییم کنید.
متشکرم

public DBAdapter(Context ctx) {
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
// DATABASE_VERSION = 1
super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(CREATE_TABLE);
} catch (SQLException e) {
e.printStackTrace();
}
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");

db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
onCreate(db);
}
}[/JAVA][/JAVA][/JAVA][/JAVA]

سلام

شما باید هر دفعه که تغییری توی دیتابیس انجام میدید ورژن رو یکی اضافه کنید
در این صورت تابع onUpgrade اجرا میشه و دیتابیستون رو آپدیت میکنه

اگر از دیتابیس آماده و لایبری SQLiteAsset Helper استفاده کنید این کار تنها با بالا بردن ورژن انجام میشه

poorman
دوشنبه 31 شهریور 1393, 12:35 عصر
سلام
من از روی نمونه کدی که گذاشته بودید لیستی درست کردم و برنامه بدون مشکل اجرا میشه و اطلاعات رو نشون میده
اما:
وقتی دکمه fav رو میزنم و از اکتیویتی بیرون میرم و برمیگردم ، تغییرات اعمال نشده
بلافاصله بعد از کد sql update یک toast گذاشتم و وضعیت fav رو چک کردم و دیدم تغییرات اعمال نمیشه
دستور sql update رو جداگانه در sqlite اجرا کردم ولی مشکلی نداشت و تغییرات رو اعمال می کنه

favotite.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
MyDatabase MyDatabase = new MyDatabase(context);
SQLiteDatabase mydb = MyDatabase.getWritableDatabase();
if(isChecked == true) {
mydb.execSQL("update [main].[tb_book] set fav = '1' where ID = " + ID[position]);
Toast.makeText(getContext(), "fav=1 / favpos:"+fav[position]+" / idpos:"+ID[position], 1000).show();
} else {
mydb.execSQL("update [main].[tb_book] set fav = 0 where ID = " + ID[position]);
Toast.makeText(getContext(), "fav=0"+position, 1000).show();
}
mydb.close();
}

});

سلام

به نظرم با شرط زیر بهتر میشه کار کرد

if(fav[position] == 1){
fav[position] = 0;
}else{
fav[position] = 1;
}

update database set fav = fav[position]


امتحان کنید، فکر میکنم مشکلتون رو حل کنه

حتما یادتون باشه که چک باکس رو توی getView براساس وضعیتی که داره تغییر بدید
if(fav[position] == 1){
checkBox.setChecked(true);
}else{
checkBox.setChecked(false);
}

zikimiki
دوشنبه 31 شهریور 1393, 15:04 عصر
سلام

این چیزی که میخواین پیاده سازی کنید ارتباطی به دیتابیس نداره
بعد از اینکه جستجو رو انجام دادید، موقع نمایش باید این مورد پیاده سازی بشه

یعنی توی نتایجی که به دست اومده، هرجایی که اون کلمه وجود داره رو هایلایت کنید

ممنون از پاسخ گویی شما
مشکل من اینجاست که نمی دونم برای نمایش از چه کدی باید استفاده کنم .توی فروم های خارجی ! هم گشتم ولی چیزی پیدا نکردم.شما کدی برای نمایش به صورت هایلات سراغ دارید؟

poorman
دوشنبه 31 شهریور 1393, 15:45 عصر
ممنون از پاسخ گویی شما
مشکل من اینجاست که نمی دونم برای نمایش از چه کدی باید استفاده کنم .توی فروم های خارجی ! هم گشتم ولی چیزی پیدا نکردم.شما کدی برای نمایش به صورت هایلات سراغ دارید؟

شما میتونید از Spannable برای این کار استفاده کنید

به این صورت که یک ایندکس از شما دریافت میکنه و توی متن اون ایندکس رو به رنگ دلخواه یا استایلی که براش مشخص میکنید در میاره

کار باهاش راحت هست، توی گوگل جستجو کنید

http://stackoverflow.com/questions/4897349/android-coloring-part-of-a-string-using-textview-settext
http://stackoverflow.com/questions/2159847/is-there-any-example-about-spanned-and-spannable-text
http://stackoverflow.com/questions/14840247/spannable-on-android-for-textview


راه دیگه هم استفاده از فرمت HTML برای تکست هست

mojniknam
دوشنبه 31 شهریور 1393, 20:19 عصر
نشد!
کل کد Adapter رو میذارم
package ir.niknam.daghdagheha;

import android.os.Bundle;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.widget.ListView;


public class ActivityFehrest extends Activity {


private MyDatabase MyDatabase;
public ListView listview;
SQLiteDatabase mydb;

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

MyDatabase = new MyDatabase(this);
mydb = MyDatabase.getReadableDatabase();
Cursor c = mydb.rawQuery("SELECT [main].[tb_book].[ID],[main].[tb_book].[nam],[main].[tb_book].[matn],[main].[tb_book].[targ],[main].[tb_book].[fav],[main].[tb_book].[khande] FROM [main].[tb_book]", null);
int ID[] = new int[c.getCount()];
String nam[] = new String[c.getCount()];
String matn[] = new String[c.getCount()];
int fav[] = new int[c.getCount()];
int khande[] = new int[c.getCount()];
int targ[] = new int[c.getCount()];
int i = 0;
if(c.moveToFirst()) {
do {
ID[i] = c.getInt(0);
nam[i] = c.getString(1);
matn[i] = c.getString(2);
fav[i] = c.getInt(3);
khande[i] = c.getInt(4);
targ[i] = c.getInt(5);
i++;
} while (c.moveToNext());
c.close();
mydb.close();
}
listview = (ListView) findViewById(R.id.listView1);
MyAdapter adapter = new MyAdapter(this, nam, matn, fav, khande, targ, ID);
listview.setAdapter(adapter);
}




}

poorman
سه شنبه 01 مهر 1393, 00:50 صبح
لطفا کلاس آداپترتون رو بذارید، این کد اکتیویتی تون هست

mojniknam
سه شنبه 01 مهر 1393, 09:39 صبح
package ir.niknam.daghdagheha;


import android.annotation.SuppressLint;
import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListe ner;
import android.widget.TextView;


@SuppressLint("ShowToast")
public class MyAdapter extends ArrayAdapter<String>{

private final Activity context;
String nam[];
String matn[];
int fav[];
int khande[];
int targ[];
int ID[];

public MyAdapter(Activity context,String nam[], String matn[], int fav[], int khande[], int targ[], int ID[]) {
super(context, R.layout.item, nam);
this.context = context;
this.nam = nam;
this.matn = matn;
this.fav = fav;
this.khande = khande;
this.targ = targ;
this.ID = ID;
}


@Override
public boolean isEnabled(int position) {
return true;
}


@SuppressLint({ "ViewHolder", "InflateParams" })
@Override
public View getView(final int position, View view, ViewGroup parent) {

LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.item, null, true);
TextView txtName = (TextView) rowView.findViewById(R.id.txt_name);
CheckBox favotite = (CheckBox) rowView.findViewById(R.id.favorite_check);
txtName.setText(nam[position]);
if(fav[position]==0) {
favotite.setChecked(false);
} else if (fav[position]==1) {
favotite.setChecked(true);
}

favotite.setOnCheckedChangeListener(new OnCheckedChangeListener() {

@SuppressLint("ShowToast")
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
MyDatabase MyDatabase = new MyDatabase(context);
SQLiteDatabase mydb = MyDatabase.getWritableDatabase();
if(fav[position] == 1) {
fav[position] = 0;
Toast.makeText(getContext(), "fav=0 / favDB:"+fav[position], 1000).show();
} else {
fav[position] = 1;
Toast.makeText(getContext(), "fav=1 / favDB:"+fav[position], 1000).show();
}
mydb.execSQL("update [main].[tb_book] set fav = "+fav[position]+" where ID = " + ID[position]);
Toast.makeText(getContext(), "favSQL / favDB:"+fav[position], 1000).show();
mydb.close();
}
});

return rowView;
} }

poorman
سه شنبه 01 مهر 1393, 13:40 عصر
@SuppressLint({ "ViewHolder", "InflateParams" })
@Override
public View getView(final int position, View view, ViewGroup parent) {

LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.item, null, true);
TextView txtName = (TextView) rowView.findViewById(R.id.txt_name);
CheckBox favotite = (CheckBox) rowView.findViewById(R.id.favorite_check);
txtName.setText(nam[position]);
if(fav[position]==0) {
favotite.setChecked(false);
} else if (fav[position]==1) {
favotite.setChecked(true);
}

favotite.setOnCheckedChangeListener(new OnCheckedChangeListener() {

@SuppressLint("ShowToast")
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
MyDatabase MyDatabase = new MyDatabase(context);
SQLiteDatabase mydb = MyDatabase.getWritableDatabase();
if(isChecked) {
fav[position] = 0;
Toast.makeText(getContext(), "fav=0 / favDB:"+fav[position], 1000).show();
} else {
fav[position] = 1;
Toast.makeText(getContext(), "fav=1 / favDB:"+fav[position], 1000).show();
}
mydb.execSQL("update [main].[tb_book] set fav = "+fav[position]+" where ID = " + ID[position]);
Toast.makeText(getContext(), "favSQL / favDB:"+fav[position], 1000).show();
mydb.close();
}
});

return rowView;
} }



با شرط isChecked این کار رو انجام بدید ببینید نتیجه چی میشه
اگر مشکل حل نشد لطفا قشنگ با جزئیات توضیح بدید که چه اتفاقی میفته

alireza142
سه شنبه 01 مهر 1393, 14:17 عصر
با سلام خدمت آقای پورمن عزیز
من یک لیست ویو سفارشی بر اساس یک بانک SQL ساختم.توی این بانک ، یک ستون به نام جنسیت هم دارم. یک دکمه هم ( در اکتیویتی که اون مقادیر رو در لیست نشون میده) ، گذاشتم که با زدنش می خوام فقط مرد ها رو در لیست نشون بده و دیگه خانم ها در لیست نباشند.(یه جور فیلتر برای دسترسی سریعتر به اسم مورد نظر). اما با زدن اون دکمه همش خطا میده و برنامه رو میبنده.
ممنون میشم بفرمایید کجای کد ها ایراد داره؟ آیا کوئری که بانک میزنم تا اطلاعات رو از بانک به کرسر و بعد به آداپتر بفرستم صحیحه؟
ممنون از لطفتون ...:لبخندساده:


اینم بخشی از کدهای اکتیویتی اصلی




.
.
.

jastMard.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {

private ArrayList<Contact> list;

dbHandler.open();
list = dbHandler.getJustMard();
adapter.setData(list);
listView.setAdapter(adapter);

}
});




این هم بخشی از کدهای کلاس DatabaseHandler




.
.
.

public ArrayList<Contact> getJustMard() {
ArrayList<Contact> contacts = new ArrayList<Contact>();

Cursor cursor = db.rawQuery("select * from " + dbHelper.getTableName()
+ " where " + dbHelper.getFieldSex() + " = 1", null);
if (cursor.moveToFirst()) {
do {
Contact contact = cursorToContact(cursor);
contacts.add(contact);
} while (cursor.moveToNext());
}

cursor.close();

return contacts;
}

poorman
سه شنبه 01 مهر 1393, 14:27 عصر
سلام

اگر LogCat خطا رو هم میذاشتید خیلی بهتر میشد تشخیص داد خطا از کجاست، اما من توصیه میکنم جایی که دارید محتویات آداپتر رو تغییر میدید، کلا آداپتر رو new کنید

یعنی به صورت زیر داخل تابع کلیک


adapter = new YourCustomAdapter(context, resource, list);
list.setAdapter(adapter);

facebookstore
سه شنبه 01 مهر 1393, 17:03 عصر
سلام دوستان ببخشید دقیقا کار دیتا بیس میتونید برا من توضیح بدهید ممنون میشم

alireza142
سه شنبه 01 مهر 1393, 19:43 عصر
سلام دوستان ببخشید دقیقا کار دیتا بیس میتونید برا من توضیح بدهید ممنون میشم
سلام

Data+Base = پایه ی+اطلاعات = بانک + اطلاعات.

همینطور که از اسمش پیداست، پایه و ریشه ای برای درج و نگه داری اطلاعات است. معمولا به صورت جداول ذخیره می شوند. مثل نرم افزار های Excel و Access که اطلاعات رو به صورت جداول معین ذخیره می کنند.
حالا اندروید برای ذخیره اطلاعات برنامه ها در قالب جداول ، از بانک اطلاعاتی SQL استفاده می کنه...

alireza142
پنج شنبه 03 مهر 1393, 08:15 صبح
سلام

اگر LogCat خطا رو هم میذاشتید خیلی بهتر میشد تشخیص داد خطا از کجاست، اما من توصیه میکنم جایی که دارید محتویات آداپتر رو تغییر میدید، کلا آداپتر رو new کنید

یعنی به صورت زیر داخل تابع کلیک


adapter = new YourCustomAdapter(context, resource, list);
list.setAdapter(adapter);


ممنون. درست شد. فقط این مواردی که شما فرمودید رو درون یک متد جدید نوشتم . چون وقتی تعریف آداپتر جدید رو درون setOnItemClickListener اون دکمه قرارش میدم، قبول نمی کنه و خطای زیر رو میداد .

123872

poorman
پنج شنبه 03 مهر 1393, 08:46 صبح
ممنون. درست شد. فقط این مواردی که شما فرمودید رو درون یک متد جدید نوشتم . چون وقتی تعریف آداپتر جدید رو درون setOnItemClickListener اون دکمه قرارش میدم، قبول نمی کنه و خطای زیر رو میداد .

123872

خواهش میکنم

این خطایی که میگید به این دلیل بوده که شما برای پارامتر اول که context هست مقدار this رو پاس میدادید
چون داخل تابع onClick بودید کامپایلر خود تابع رو به عنوان پارامتر میفرستاده
برای حل این مشکل کافی بود اسم اکتیویتی رو با this بنویسید مثلا yourActivity.this

zikimiki
شنبه 05 مهر 1393, 21:16 عصر
سلام و خسته نباشید.

مشکلی که من دارم اینکه یک لیست ویو دارم داخل اکتیویتی x که اطلاعات رو از دیتابیس می گیره و نشون میده.
من تونستم چند فیلتر برای مطالبی که در لیست ویو دارم بذارم.مثلا سه دسته گل و گیاه و میوه ! این سه دسته فیلتر های من هستند به طوری که اگه روی گل کلیک بشه فقط گل ها رو و اگر روی گیاه کلیک بشه فقط گیاه ها رو و... و اگه هم روی دکمه "همه موارد" کلیک بشه همه رو نشون میده.
من وقتی بر روی "همه موارد" هستم و مطالب رو پیمایش می کنم و یک مطلب که در ردیف 100 هست رو نگاه می کنم پس از برگشت دقیقا بر میگرده به همون مطلب و همان ردیفی که در لیست ویو بود (برخلاف همه لیست ویو ها به اول نمی ره ) ولی مشکل از جایی شروع میشه که وقتی که روی فیلتر ها کلیک می کنم ، مثلا روی گل کلیک می کنم و یک مطلبش رو می بینم پس از برگش بر می گرده به "همه موارد" و همه مطالب رو نشون میده.در حالی که من می خوام بر گرده به همون موضوع فیلتر ، مثلا به ادامه گل ها !

میشه لطفا راهنمایی کنید که چیکار باید کنم؟

poorman
دوشنبه 07 مهر 1393, 12:24 عصر
سلام و خسته نباشید.

مشکلی که من دارم اینکه یک لیست ویو دارم داخل اکتیویتی x که اطلاعات رو از دیتابیس می گیره و نشون میده.
من تونستم چند فیلتر برای مطالبی که در لیست ویو دارم بذارم.مثلا سه دسته گل و گیاه و میوه ! این سه دسته فیلتر های من هستند به طوری که اگه روی گل کلیک بشه فقط گل ها رو و اگر روی گیاه کلیک بشه فقط گیاه ها رو و... و اگه هم روی دکمه "همه موارد" کلیک بشه همه رو نشون میده.
من وقتی بر روی "همه موارد" هستم و مطالب رو پیمایش می کنم و یک مطلب که در ردیف 100 هست رو نگاه می کنم پس از برگشت دقیقا بر میگرده به همون مطلب و همان ردیفی که در لیست ویو بود (برخلاف همه لیست ویو ها به اول نمی ره ) ولی مشکل از جایی شروع میشه که وقتی که روی فیلتر ها کلیک می کنم ، مثلا روی گل کلیک می کنم و یک مطلبش رو می بینم پس از برگش بر می گرده به "همه موارد" و همه مطالب رو نشون میده.در حالی که من می خوام بر گرده به همون موضوع فیلتر ، مثلا به ادامه گل ها !

میشه لطفا راهنمایی کنید که چیکار باید کنم؟

سلام

کدهای مربوط به قسمتی که برمیگردید رو بذارید تا ببینم دقیقا چه کاری انجام میشه، شاید بتونم راهنمایی تون کنم

mojniknam
دوشنبه 07 مهر 1393, 23:45 عصر
سلام
درخصوص نمونه کد دیتابیس، همون لیست ویو
چطور میشه همزمان با کلیک کردن روی یک ردیف از لیست ویو، چک باکسی در همون ردیف روشن بشه و مقدارش در دیتا بیس ذخیره بشه؟

mojniknam
سه شنبه 08 مهر 1393, 12:00 عصر
سلام
درخصوص نمونه کد دیتابیس، همون لیست ویویی که گذاشتین
1- چطور میشه ID ردیفی که روش کلیک شده رو بدست آورد؟ (منظورم ID ردیف دیتابیس هست نه ردیف لیست ویو)
2- چطور میشه به ویجت های ردیف کلیک شده دسترسی پیدا کرد (مثلا چک باکس ردیفی که کلیک شده true بشه)