تشکر
فعلا فقط داخل Cursor میریزم وهیچ کاری باهاش نمی کنم ، ممکنه مشکل از اون باشه؟
اینیم که گفتین چک کردم
قبل کوئری لوگ داد
لوگ بعد کوئری رو نداد
تشکر
فعلا فقط داخل Cursor میریزم وهیچ کاری باهاش نمی کنم ، ممکنه مشکل از اون باشه؟
اینیم که گفتین چک کردم
قبل کوئری لوگ داد
لوگ بعد کوئری رو نداد
پس تنها دلیلش میتونه این باشه که دیتابیس رو مقدار ندادین یا بازش نکردین
بهتره هرجایی که با دیتابیس کار دارین همونجا بازش کنین و بعد از تموم شدن کارتون اون رو ببندید
آقا این کاری رو هم که گفتین انجام دادم نشد
مرسی از لطفتون که راهنماییم کردین
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));
شما اگه بخوای خیلی ساده انجام بدی، این کار رو با کوئری میکنی به این صورت :
select * from yourTable where favorite = "yes"
و بعد اطلاعات رو میریزی توی آرایه و میدی به لیست
راههای سخت ترش میتونه این باشه که همین cursor که الان داری رو فیلتر کنی و بعد اطلاعاتش رو بریزی توی آرایه ( من فیلتر cursor رو کار نکردم )
راه دیگه میتونه این باشه که وقتی داری اطلاعات cursor رو میریزی توی آرایه، یک شرط بذاری که اگر مقدار cursor.getString(cursor.getColumnIndex("favorite") برابر yes بود اطلاعات رو بریزه توی آرایه
حالا دقیقا نمیدونم نیازت چیه و کجا میخوای این رو پیاده سازی کنی
همون روش اول که گفتی به جای کوئری زیر همونی گفتی را قرار میدیم ؟
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));
آره کوئری رو با اون چیزی که گفتم عوض میکنی
توی کد آرایه لازم نیست چیزی رو تغییر خاصی بدی، همه چیز مثل قبل هست، فقط با این کوئری سطرهایی توی cursor ریخته میشن که favorite = "yes" باشه
البته من توی اون کوئری گفتم select * ، این یعنی تمام ستون ها رو برگردونه، اما شما هرچیزی که لازم داری رو بگو مثلا select rowid
میشه چندتا مورده استفاده خوب که واقعا استفاده از این خوبه رو بگید تا پروژه تون قشنگ برام جا بیوفته ؟
دیتابیس یا به زبون خودمون پایگاه داده، واسه ذخیره اطلاعات زیاد و دسترسی بهشون و تغییر راحت اطلاعات استفاده میشه
به عنوان مثال اطلاعات کارمندان یک اداره رو میتونید توی دیتابیس ذخیره کنید که هم راحت بهش دسترسی داشته باشید و هم راحت بتونید اونا رو تغییر بدید یا حذف کنید
یا یک مثال خیلی ساده متن یک کتاب رو داخل دیتابیس بریزید، اینطوری علاوه بر نظم توی نگهداری اطلاعات، میتونید از قابلیت جستجو هم بهره ببرید
کلا فواید زیادی داره، یک پروژه بزرگ رو خیلی سخت میشه بدون دیتابیس پیاده سازی کرد
انواع زیادی از اطلاعات رو میشه توی دیتابیس ذخیره کرد
عکس به صورت بایت توی دیتابیس ذخیره میشه و میشه راحت ازش خوند
اطلاعات منطقی مثل true, false و بیشتر انواع داده رو میتونید توی دیتابیس ذخیره کنید
دوستان من یه دیتابیس ساختم که 7تا تیبل داره.
میخوام هر کدوم از اونا رو داخل یه لیست ویو نمایش بدم.
میشه راهنماییم کنید از همون اول چکار کنم؟
من تازه کار هستم و با دیتابیس کار نکردم.تمام پستها رو هم خوندم اما بازم نتونستم پیاده سازی کنم.
لطفا راهنماییم کنید.متشکرم
دوست عزیز شما توی کدوم قسمت مشکل دارید ؟
دیتابیستون آماده هست یا از طریق کد ساختید ؟
تا حالا با لیست ویو کار کردید ؟
اگر با لیست ویو کار کردید، توی پست اول، قسمت خواندن اطلاعات، من توضیح دادم که چطور اطلاعات رو از یک تیبل داخل آرایه بریزید، بعد از اینکه شما اطلاعات رو داخل آرایه ریختید خیلی راحت اونا رو میفرستید به آداپتر لیست ویو خودتون و نمایش میدید
میتونید از نمونه برنامه های آماده هم استفاده کنید تا کمک بگیرید برای پروژتون
https://barnamenevis.org/showthread.p...=1#post2016418
ممنونم از توجهتون
بله دیتابیسم آمادست
مشکل من اینه که واسه 7تا تیبل نمیدونم باید چجوری بیارم؟
بله قبل از اینکه سوالمو مطرح کنم این نمونه رو گرفتم.اما اونم فقط یک تیبل داره و نتونستم مشکلمو باهاش رفع کنم.
واسه اینکه 7تا تیبل دارم باید اونا رو چطور فراخوانی کنم؟
بله با لیست ویو کار کردم اما تا الان با آرایه لیست ویومو پر میکردم.
این هم همینطور پر میشه؟
شما میخواین اطلاعات هر 7 تا تیبل رو با هم بریزید توی لیست ویو ؟ یا اینکه هر کدوم رو توی یک اکتیویتی و یک لیست ویو جدا نمایش بدید ؟
اگر میخواین هرکدوم رو جدا نمایش بدید که کار مثل قبله و هیچ فرقی نداره، فقط باید اسم تیبل عوض شه
اگر میخواین همه رو با هم نمایش بدید، شما باید این کار رو برای هر تیبل انجام بدید اما به این دلیل که شما ممکنه ندونید چقدر اطلاعات دارید که فضای مشخصی از آرایه رو بهش اختصاص بدید
بهتره ابتدا اطلاعات رو داخل arrayList بریزید، یعنی ابتدا واسه تیبل اول کوئری مینویسید و اطلاعاتش رو داخل arrayList اضافه میکنید، بعد دوباره برای تیبل دوم همینکار رو میکنید و تا تیبل آخر
حالا arrayList شما حاوی اطلاعاتتون هست، آرایه خودتون رو براساس سایز arrayList دوباره سازی کنید و اطلاعات رو از arrayList بریزید داخل آرایه ( توسط یک حلقه )
البته اگر شما کار با کاستوم آداپتر لیست ویو رو یاد دارید میتونید با انجام یکسری تغییرات به جای اینکه ورودی آداپترتون آرایه باشه، همون arrayList رو مستقیم بفرستید به آداپتر و از انجام محاسبات اضافی پیشگیری کنید
---------------------------------------------------------------
برای توضیح بیشتر بهتره بگم که آرایه نیاز داره که فضای مشخصی داشته باشه و وقتی فضاش مشخص شد نمیتونیم بیشتر از اون مقدار بدیم بهش
اما arrayList یک نوع آرایه بدون محدودیت فضاست، ما میتونیم بدون مشخص کردن تعداد خونه ها، هر اندازه که خواستیم به اون اضافه کنیم و البته یکسری قابلیت های خوب دیگه هم داره
خیلی خیلی ممنونم از وقتی که میزارید.
بله هر تیبل توی یه لیست جداگانه نمایش داده میشه.
پس فقط لازمه توی هر اکتیویتی نام جدول رو تغییر بدم؟درسته؟ با توجه به اینکه ستونهای تیبلها یک نوع هستند.
انشاالله شروع میکنم و دوباره میسازم.قبلا که چندبار ساختم نشد.یه بار صفحه اومد اما اطلاعات رو از دیتابیس نخوند و بار دوم هم که اصلا تا اکتیویتی میخواد بیاد بسته میشه D:
ممنونم از وقتی که گذاشتید.
در ضمن آقا ، هم شهری هم هستیماا!!
موفق باشید
آقا عذر میخوام یه سوال دیگه
ببخشید
این نام دیتابیس منظور چیه؟
توی ساخت دیتابیس بهش دادیم؟ یا یک نامی که تو کلاس دیتابیس میسازیم و اصلا ربطی به اون نامی که موقع ساختن دیتابیس آماده دادیم نداره؟
شما اگه از دیتابیس آماده استفاده میکنید، توی پست اول فقط از قسمت وارد کردن اطلاعات در جدول به بعد استفاده کنید
چون قبل از اون دارم ساخت دیتابیس داخل خود اکلیپس و باز کردنش رو توضیح میدم
توی دیتابیس آماده اسم فایلتون رو که با پسوند .db.zip تعریف میکنید و توی کلاس دیتابیس هم اسم رو با پسوند .db مینویسید، بعد از انجام اینکارا، شما دیگه هیچ کاری با اسم دیتابیس ندارید
فقط توی اکتیویتی میگید mydb = mydatabase.getReadable
ممنونم از لطفتون.بزرگواری کردید
اگه ممکنه یه تکه کد بزارید که من چطوری اطلاعات 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);
}
}
آقای poorman ؟
میشه تقاضا کنم اگه ممکنه یه نمونه برنامه از دیتابیس که 2تا جدول داره و محتویات یک ستون آنها در لیست ویو فراخوانی میکنه در دو صفحه رو معرفی کنید یا در صورت امکان خودتون لطف کنید.چند هفته است نمیتونم انجامش بدم.خیلی ضروریه.
فکر میکنم سوال خیلی از دوستان دیگمون هم باشه
خیلی ممنونم ازتون
خدا به علم شما برکت بیش از این بده
سلام poorman جان
من میخوام رو یه پروژه پیامک کار کنم
میخواستم بدونم دیتابیس را باید چطوری بسازم؟
مثلا 10 تا table (برای هر موضوع یکی)درست کنم که تو هر table یه ستون متن و یه ستون علاقه مندی ها بزارم ؟
یا اینکه باید یه table درست کنم در 20 تا ستون توش بزارم و هر دو ستون یکی موضوع پیامک و دیگری علاقه مندی برای اون موضوع؟
کدومش درسته؟
سلام
اول بذار تشکر کنم که اومدی پرسیدی، چون من یک برنامه توی بازار دیدم که بنده خدا سازندش واقعا معماری خنده داری واسه دیتابیسش داشت
یک کتاب بود با 15 تا فصل، این اومده بود 15 تا ستون گذاشته بود واسه هرفصل یک ستون، بعد اینا رو مقدار داده بود و ...
البته اینو بگم من اصلا توی دیتابیس خودم رو حرفه ای نمیدونم
حالا بیخیال
آقا برنامه پیامک شما اگر تعداد رکوردهات زیاد هست، یعنی 30-40 هزار تا پیامک داری، از نظر سرعت در سرچ و ... با فرض اینکه 20 موضوع داری، بهتره که 20 تا تیبل داشته باشی
اگر تعداد کمه یا به هر دلیلی حال و حوصله نداری، شما دو تا تیبل میسازی، توی یکی از شماره 1 تا 20 موضوعات رو وارد میکنی ( دو تا ستون، یکی آیدی، یکی اسم موضوع)
توی جدول دوم که پیامک هات رو وارد میکنی، یک ستون میذاری واسه موضوع، بعد هر پیامک رو میگی موضوعش شماره چنده
توی برنامه هم خیلی راحت select میکنی رکوردهایی رو که موضوعشون شماره فلان هست
پس همون روش اولو درست میکنم چون 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);
من که نفهمیدم چی سوال کردی
الان کل مشکلت اینه که چطور به کلاس آداپتر لیست ویو بفهمونی داره با کدوم تیبل کار میکنه ؟
یک متغیر جهانی بذار، هر آیتمی که انتخاب شد، موقعیتش رو توی اون ذخیره کن
توی کلاس آداپتر هم اون موقعیت رو بگیر
درست فهمیدم سوالت رو یا نه ؟؟؟
من یه کلاس درست کردم به اسم علاقه مندی که میخوام آیتم هایی که به علاقه مندی اضافه شد (در تمام table ها) را در این کلاس نشون بدم
باید چطور این کار را بکنم؟
تو هر table یه ستون با نام favorite ساختم که مقدارش به yes تبدیل میشه
میشه اینطور نوشت؟ چند تا تیبل را با هم فراخونی کرد
Cursor cursor = mydb.rawQuery("select rowid from table1,table2,table3,table4 where favorite = 'yes'" , null);
آخرین ویرایش به وسیله hamedjj : دوشنبه 12 خرداد 1393 در 00:29 صبح
فکر کنم باید از دستور GROUP BY استفاده کرد . ولی بازم ارور میده .. شاید درست ننوشتمش
این لینک را ببینید
http://stackoverflow.com/questions/1...sqlitedatabase
نه اینطوری که نمیشه از چند تا تیبل خوند، کوئری غلطه
دستور group by برای گروه بندی کردنه، اصلا ربطی به ماجرای چند تا تیبل نداره
برای اینکه از چند تا تیبل یکجا بخونی باید از دستور UNION استفاده کنی، من خودم تا حالا ازش استفاده نکردم چون نیاز نداشتم
این لینک میتونه کمکت کنه
http://www.w3schools.com/sql/sql_union.asp
اگر به هر دلیلی نتونستی، من خودم اسم جدول ها رو میریزم توی یک آرایه، بعد توی یک حلقه هی از هر جدول SELECT میکنم و میریزم توی ListArray
راه حل درستی شاید نباشه، اما حوصله ندارم چیز دیگه رو پیدا سازی کنم![]()
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]
حرفت درست بود آخرش را نخوندم
پاسخ:
SELECT rowid FROM table1
WHERE favorite='yes'
UNION ALL
SELECT rowid FROM table2
WHERE favorite='yes'
ویرایش : تا من اومدم جواب بدم خودت جواب درست رو گفتی دیگه
---------------------------------------------------------------------
گفتم که من استفاده نکردم، ولی JOIN هم کاربردش متفاوت هست، برای وقتی هست که میخوای دو تا تیبل رو با هم میکس کنی
این کوئری که یکی از بچه ها گفته رو فک نمیکنم جواب بده، یه جورایی مثل همون JOIN هست
الان از تست کردن که کسی ضرر نمیکنه، دو تا جدول رو با هم UNION ALL کن ببین چی میشه
سلام دوستان
لطفا راهنماییم کنید چطوری میشه مکان اسکرول رو در دیتابیس ذخیره کرد تا وقتی از لیست به یه مطلب میریم و برمیگردیم دوباره لیست از اول شروع نشه و از همونجایی که بودیم ادامه پیدا کنه.
ممنونم