ممنون
درست کردم و زمانی که فایل zip میکردم خطا میداد
بعد با حالت معمولی گذاشتم درست شد
اما حالا بعد ریختن اطلاعات از طریق برنامه میخوام با sqlitebrowser محتویات ببینم
الان که محتویاتش نگاه میکنم میبینم اطلاعاتی درونش درج نشده
باید چیکار کنم؟
ممنون
درست کردم و زمانی که فایل zip میکردم خطا میداد
بعد با حالت معمولی گذاشتم درست شد
اما حالا بعد ریختن اطلاعات از طریق برنامه میخوام با sqlitebrowser محتویات ببینم
الان که محتویاتش نگاه میکنم میبینم اطلاعاتی درونش درج نشده
باید چیکار کنم؟
بعد از اینکه دیتابیس رو ساختید حتما باید ذخیره کنید تا اطلاعات داخلش ثبت بشه
دیتابیس رو که ذخیره کردید، اگر بعدا خواستید اطلاعات رو ببینید یا تغییر بدید open database میزنید و فایل دیتابیس رو انتخاب میکنید تا دیتابیس باز بشه
من دیتابیس با این برنامه ساختم
بعد در پوشه و مسیرهایی که شما گفتین کپی کردم
و از طریق برنامه اندروید داخلش اطلاعات ذخیره کردم
حالا میخوام همون اطلاعات از طریقsqlitebrowser ببینم
الان کلاسی که گفتین گذاشتم این کدها قرار دادم
SQLiteDatabase mydb; MyDataBase = new MyDatabase(this);
mydb = MyDataBase.getWritableDatabase();
mydb.execSQL("insert into ramz (name,pass) values ('3','3' ) ");
آها شما میخواین بعد از انجام تغییرات توی برنامه دیتابیس رو ببینید
برای این کار باید برید به همون DDMS و پوشه دیتا و باز دیتا و بعد پوشه برنامه تون
توی اون تاپیک دیگه گفتید که اونجا نتونستید پیدا کنید، در حالت عادی باید همین جا باشه، مگر اینکه جا به جا کرده باشید ( جای دیگه اش رو اطلاع ندارم الان )
بالاخره فایل دیتابیس برنامه رو باید از طریق همون DDMS بگردید و پیدا کنید، بعد از اینکه پیدا کردید فایل رو انتخاب میکنید، یک آیکون اون بالا هست شبیه save که با اون فایل دیتابیس رو توی کامپیوتر ذخیره میکنید و با نرم افزار بازش میکنید
سلام استاد.
چطور میتونم اطلاعات رو از دیتابیس با do و while بگیرم؟
میخوام اطلاعات رو بریزیم توی یک arrayAdapter بعد به یک لیست ویو لینکش کنم.
میشه راهنمایی کنید ؟
سلام
بابا به خدا من دانشجوام انقد نگو استاد
این کاری که شما میخواین انجام بدید آموزشش توی پست اول همین تاپیک وجود داره
همچنین این نمونه برنامه که گذاشتم میتونه کمکتون کنه توی این کار
باز هم من سعی میکنم یک پروژه کامل واسه کار با دیتابیس تا آخر این هفته بذارم
poorman جان تو پروژه افزودن به علاقه مندی ها یه اشکال هست که نتونستم برطرف کنم
اگر داده ها زیاد باشه و اولیین ستاره را لمس کنی و روشن بشه مقدار برابر با yes میشه اما اگه یه اسکرول به پایین کنی و دوباره بالا بیای ستاره خود به خود خاموش میشه (اما مقدار هنوز yes هست)
اگر از او اکتیویتی بیرون بیای و دوباره واردش بشی درست میشه و مشکلی نداره
مشکل اینه چطور باید کار کنیم همون موقع داده ها از رو دیتابیس خوانده بشه؟
همونجا که داده ها رو توی دیتابیس آپدیت میکنیم ، آرایه رو هم تغییر بده
یعنی :
likes[position] = "yes";
اون مشکلی که در بالا گفتم خود تو پروژه شما که از 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);
}
}
حامد جان چیزی که من پیدا کردم اینه که نمیشه اطلاعات cursor رو مستقیما تغییر داد
شما باید بعد از اینکه دیتابیس رو آپدیت کردی cursor رو requery() کنی ( دیگه تاثیرش روی سرعت رو نمیدونم )
ولی حالا چه اصراری که از CursorAdapter استفاده کنی ؟ مگه آرایه چه مشکلی داره ؟ دست آدم بازتره برای کار با لیست ویو
آره راست میگی بهتره از آرایه استفاده کرد
من دارم برای آموزش و یادگیری این پروژه ها را انجام میدم
با آرایه که خوب پروژه شما هست
می خواستم بدونم با cursorAdapter چطور میشه انجام داد
بازم دمت گرم که جواب سوال هام را دادی
شاید یه تاپیک زدم ببینم بچه ها چی میگن
البته منم قبل اینکه این پروژه رو بهم بدی اصلا نمیدونستم با cursor میشه آداپتر رو ساخت
و به نظرم راه جالبی اومد برای افزایش سرعت
یک راه حل به ذهنم رسید، بیا علاوه بر cursor که میفرستی، آرایه likes رو هم بفرست، اینطوری هم سرعت کم نمیشه هم کار درست میشه
یعنی چطوری این کارو بکنیم؟
کاری نداره که دیگه
توی آداپتر مقادیر ورودی رو علاوه بر 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 مقدار نده، از این آرایه مقدار بده
الان curser مثل datatable در سی شارپ عمل میکنه؟
چطر میتونیم یک کلاس بنویسیم که اطلاعات در کرسر بریزه و به صورت استاتیک به بقیه صفحات پاس بدیم
یعنی میخوام برای همه پروزه فقط یک کلاس نوشته بشه هر بار همون فراخونی بشه و فقط دستور اسکیول به عنوان ورودی داده بشه و خروجی اون هم بصورت استاتیک به هر فرمی خواستیم داده بشه
من C# کار نکردم ( VB.NET ) کار کردم، اما فک میکنم آره مثل همون دیتا تیبل باشه
اینکه شما یک کلاس برای پاس دادن cursor بنویسید کار خاصی نداره!!! شما وقتی یک متغیر cursor پابلیک داشته باشی، از تمام اکتیویتی ها و کلاس های دیگه میتونی بهش دسترسی داشته باشی
شما بر فرض توی اکتیویتی اول این cursor عمومی رو مقدار بدین، بعد توی اکتیویتی های دیگه اطلاعاتش رو بخونین
ولی در کل به نظر من این کار لازم نیست، مگر اینکه شما فقط یک یا دو کوئری داشته باشید
چون اگر هر بار بخواین اطلاعات دیتابیس رو توی cursor نگه دارید، فضای زیادی مصرف میشه و چون پابلیک هست این فضا آزاد نمیشه
بله فضای زیادی اشغال میکنه
اما دستوری نیست که بعد استفاده از کرسر خالیش کنیم تا فضا ازاد بشه؟
چون به نظر من جالب نیست ما در هر فرمی این تابع بنویسیم فراخونی کنیم اگر در یک کلاس باشه و یکبار نوشته بشه خیلی بهتره
نظرتون چیه؟
سلام استاد .
من باید توی پروژه از join استفاده میکنم.
فارین کی ها رو با sqlitestudio-2.1.5 در دیتابیسم ساختم.
اما به محض اینکه از دستور inner join استفاده میکنم برنامه خطا میده.
این هم کدهام هستن :
Cursor row = mydb.rawQuery("SELECT table2.* FROM table1 "
+ "INNER JOIN table2 ON table1.a = table2.b", null);
ممنونم.
ببینید کار شما دو تا حالت داره، یکی اینکه کلا دو تا کوئری دارید و روند خواندن اطلاعات از cursor توی تمام صفحات یکسان هست
تو این حالت حرف شما عملی میشه، شما یک تابع پابلیک میذارید و بعد از فراخوانی اطلاعات رو برمیگردونید ( دست خودتونه از چه نوع باشه )
حالت دیگه اینه که کوئری های شما شکل یکسان نداره
توی این حالت تنها میشه کوئری فرستاد و cursor رو دریافت کرد، که تاثیری توی خلاصه سازی نداره به نظر من !!!
دیگه چیزی که من توی بساطم داشتم همین بود
حالا بازم سرچ بزن اگه راه دیگه ای پیدا شد که جواب بده ما رو بی خبر نذار
آقای poorman راست میگن اما اگه میشه وقتی به راه حلی رسیدین یه سورس بزارید تا همه استفاده کنند.
من هم از این روش استفاده میکنم و به مشکل برخوردم.
باسلام
این برنامه خطادر بازکردن بانک میذه من تو چه مسیری دنبال بانک باشم؟؟؟
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;
}
کدتون خیلی قاطی پاتیه !!! بهتر بود کدهاتون رو توی تگ جاوا بذارید تا بشه راحت خوند
خطایی رو هم که میده بذارید شاید کمک کنه توی فهمیدن مشکلتون
سلام ،
کلا کلاسوفرستادم،من نمیدونم کجا باید دنبال فایل دیتابیسم بگردم یا دستی کجا بزارمش؟؟؟
درزمان اجرا در 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;
}
}
آخرین ویرایش به وسیله f.asadkhani : پنج شنبه 25 اردیبهشت 1393 در 11:55 صبح
الان این کد شما در زمان اجرا میاد تمام مسیرهایی که ممکن هست دیتابیس اونجا باشه رو چک میکنه، اگر دیتابیس رو پیدا کنه، برمیگردونه
اگر دیتابیس رو پیدا نکنه خودش توی مسیر local میسازه دیتابیستون رو
شما که میگی پیدا نمیکنه، چون دیتابیس رو قبلا نساختی یا توی اون مسیر کپی نکردی
اگر دیتابیستون آماده ست، از لایبری SQLite Asset Helper استفاده کنید که آموزشش توی همین تاپیک هست
اگر میخواین دیتابیس رو خودتون توی برنامه بسازید، با همین کلاس خب دیتابیس رو میسازه، اما مسیرش رو طوری تنظیم کنین که اگر آخرین شرط ( یعنی local ) هم برقرار نبود، بره توی پوشه data/data/package/database بسازه مثلا
مرسی که بررسی کردین،من دیتابیسم آماده هس الان طبق این برنامه کجا برم بزارمش؟؟که بر نامه بتونه پیداش کنه من از این مسیرش سردرنمیارم....من یه پوشه درس کردم و اسمشو 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 یه تابع داره شما گفته بودین خونون و نوشتن فرق میکنه...
آخرین ویرایش به وسیله f.asadkhani : شنبه 27 اردیبهشت 1393 در 13:44 عصر
ببینین شما دیتابیس آماده دارید، برای دیتابیس آماده خدایی من یک هفته هرچی روش توی اینترنت پیدا کردم رو امتحان کردم، هیچی ساده تر و بی اشکال تر از لایبری SQLite Asset Helper نبود
این کدهایی که نوشتید برای کار با دیتابیسی هست که توسط خود برنامه بسازید، این دیتابیس ساخته شده توی گوشی و در آدرسهایی که توی کدتون هست میتونه ذخیره بشه
اگر شما میخواین از این کدها برای دیتابیس آمادتون استفاده کنین، باید یک تابع بنویسید که اگر دیتابیستون توی این مسیرها نبود، دیتابیستون رو از توی پوشه asset کپی کنه توی این مسیرها ( که داخل گوشی هست )
ولی بازهم راحت ترین و بهترین کار استفاده از همون لایبری هست که آموزشش رو گذاشتم، لازم نیست تمام توابع رو دوباره نویسی کنید!!!
خوندن و نوشتن و تمام کارهای دیتابیس به همون صورت قبلی هست، تنها تفاوت توی مقدار دادن دیتابیس هست، شما همین رو تغییر بدید دیگه نیازی به تغییر بقیه جاها نیست که
اوکی بازم تشکر که جواب دادین،تلاشمو میکنم ببینم چی میشه...
برنامه من واسه cursor.getInt خطا میگیره چیکار کنم؟؟
منظور سوالتون رو شاید درست متوجه نشده باشم
اسم دیتابیس رو توی کلاس MyDatabase بذارید، همون کلاسی که کدش رو گذاشتم
بعدش توی اکتیویتی تون از اون کلاس یک متغیر تعریف میکنید و دیتابیستون رو باهاش مقدار میدین
سلام من میخوام اطلاعات رو از جدولم بگیرم بریزم تو یه 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);
البته اینم خطاهای لوگ کت
Capture.PNG
من الان متوجه نمیشم خطا از کجای کدتون هست، اما چیزی که مشخصه خطا از دیتابیستون نیست
اگر هم خطا از دیتابیستون باشه شاید قبلش دیتابیس رو مقدار ندادید و باز نکردید
احتمالات دیگه رو امتحان کنید، به جای اینکه مقدار رو از تکست ویو بگیرید و اسم ستون ها و جداول رو از کلاس database بگیرید، اینا رو خودتون توی کوئری تایپ کنید ببینید درست کار میکنه؟
با تشکر
اینکاری که گفتین انجام دادم
قبل کد هم دیتابیس رو باز کرده بودم و هم مقدار رو قبلش بهش داده بودم
منتها اررو میده
کد اپدیت هم همین ارور رو میده
بعد از اینکه اطلاعات رو میریزید داخل cursor چه کار میکنید ؟ کد اون قسمت مشکلی نداره ؟
قبل و بعد از کوئری توی یک logCat بذارید ببینید خطا دقیقا از کوئری تون هست یا قسمت های دیگه