PDA

View Full Version : محل ذخیره شدن دیتابیس روی تبلت



sara_traveler
یک شنبه 20 دی 1394, 15:55 عصر
سلام
من برنامه با پایگاه داده نوشتم و روی تبلت اجرا کردم
حالا میخوام اطلاعاتی که ذخیره کردم ببینم
اما دیتابیس روی تبلت پیدا نمیکنم
میخواستم محل ریخته شدن برنامه و دیتابیسس بدونم
با تشکر

ehmPro
یک شنبه 20 دی 1394, 22:51 عصر
درست متوجه سوال شما نشدم.
شما چجوری اطلاعات در دیتابیس ذخیره کردی که مسیرش رو نمیدونی...؟

sara_traveler
سه شنبه 22 دی 1394, 10:47 صبح
وقتی برنامه با ایمیلیتور اجرا میکنم دسترسی به اطلاعات و پایگاه داده دارم
اما وقتی برنامه نصب میکنم روی تبلت
محل ذخیره سازی نمایش نمیده و مشخص نیست کجاست
من محل ذخیره برنامه و اطلاعات روی تبلت میخوام

saeedr22
سه شنبه 22 دی 1394, 11:29 صبح
با سلام مسیر دیتا در آندروید به صورت پیش فرض به صورت زیر می باشد
/data/data/package_name
package_name نام اسمبلی برنامتون هستش

ehmPro
سه شنبه 22 دی 1394, 12:29 عصر
وقتی برنامه با ایمیلیتور اجرا میکنم دسترسی به اطلاعات و پایگاه داده دارم
اما وقتی برنامه نصب میکنم روی تبلت
محل ذخیره سازی نمایش نمیده و مشخص نیست کجاست
من محل ذخیره برنامه و اطلاعات روی تبلت میخوام

تا وقتی که دستگاه مورد نظر (گوشی یا تبلت) روت نشده باشه دسترسی به فولدرهای سیستمی امکان پذیر نیست.
اگه دستگاه روت نشده باشه فولدر پکیج های نصب شده روی دستگاه نمایش داده نمیشه و دسترسی به فولدر هر برنامه فقط از داخل کد همون برنامه امکان پذیره.
البته این قضیه در مورد امولیتور صدق نمیکنه. در واقع میشه گفت امولیتور یک دستگاه روت شده هستش که شما میتونی به فولدر پکیجت دسترسی داشته باشی...

saeedr22
سه شنبه 22 دی 1394, 13:00 عصر
البته شما می تونین با استفاده از دستور زیر از دیتابیس بک آپ بگیرین و خروجی هم تو تبلت هایی که روت نشدن ببینین.
public void copyDataBase() {
Log.i("info", "in copy data base at finally");
try {
File sd = Environment.getExternalStorageDirectory();
File data = Environment.getDataDirectory();
if (sd.canWrite()) {
String currentDBPath = "/data/" + this.getPackageName()
+ "/databases/ECADB";
String backupDBPath = "DB_29Apr2.sqlite";
File currentDB = new File(data, currentDBPath);
File backupDB = new File(sd, backupDBPath);
if (currentDB.exists()) {
FileChannel src = new FileInputStream(currentDB)
.getChannel();
FileChannel dst = new FileOutputStream(backupDB)
.getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();
}
}
} catch (Exception e) {
Log.i("info", "in copy of bata base 10 ");

}
}

sara_traveler
سه شنبه 22 دی 1394, 13:08 عصر
این خروجی الان کجا ریخته میشه که بتونم براش دارم و روی سیستم بریزم
سوال دومم : چطور میتونم دیتابیس اماده داخل پوشه asset قراربدم که برنامه اطلاعات از اون بخونه نه خودش جداول ایجاد کنه
و من با زامارین دارم کدها مینویسم
ممنون

saeedr22
سه شنبه 22 دی 1394, 13:27 عصر
با استفاده از دستور Environment.getExternalStorageDirectory() تو مسیر root sd.nv در ضمن در مثال ecadb نام فایل دیتا بیس من هستش که تو کلاس دیتابیس برنامه نام گذاریش کردم

با استفاده از دستورات زیر میشه از assets دیتابیس رو درست کرد.
public void createDataBase(Context ctx) throws IOException{

boolean dbExist = checkDataBase();

if(dbExist){
//do nothing - database already exist
}else{

//By calling this method and empty database will be created into the default system path
//of your application so we are gonna be able to overwrite that database with our database.
this.getReadableDatabase();

try {

copyDataBase(ctx);

} catch (IOException e) {

throw new Error("Error copying database");

}
}

}

/**
* Check if the database already exist to avoid re-copying the file each time you open the application.
* @return true if it exists, false if it doesn't
*/
private boolean checkDataBase(){

SQLiteDatabase checkDB = null;

try{
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

}catch(SQLiteException e){

//database does't exist yet.

}

if(checkDB != null){

checkDB.close();

}

return checkDB != null ? true : false;
}

saeedr22
سه شنبه 22 دی 1394, 13:34 عصر
تابع copydatabase جا مونده بود.
private void copyDataBase(Context ctx) throws IOException{

//Open your local db as the input stream
InputStream myInput = ctx.getAssets().open(DB_NAME);

// Path to the just created empty db
String outFileName = DB_PATH + DB_NAME;

//Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);

//transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}

//Close the streams
myOutput.flush();
myOutput.close();
myInput.close();

}

sara_traveler
سه شنبه 22 دی 1394, 13:58 عصر
ممنون از کدهای مفیدتون
منتها من چون تو زامارین کدها مینویسم بعضی تابع هاش نیست
شما کد مونواندروید ندارین؟
با تشکر

saeedr22
سه شنبه 22 دی 1394, 15:42 عصر
براتون کدهای xamarinesho آماده میکنم.

saeedr22
چهارشنبه 23 دی 1394, 01:35 صبح
دوست عزیز ابتدا از لینک زیر sqllite-net رو دانلود کنین که همراهش هم یک سورس نمونه وجودد داره.
https://github.com/praeclarum/sqlite-net
اکنون sqllite3.dll را از داخل فایل دانلود شده پیدا کرده و به پروژه خود بیافزایید.
سپس فایل دیتابیس خود را در مسیر assets کپی کنید.
اکنون با استفاده از راهنمایی تصویر زیر فایل دیتابیس خود را به عنوان Assets فایل آندروید معرفی کنید.
138355
اکنون با استفاده از کد زیر فایل را از asset به بیرون از apk کپی کنید
string dbName = "db.sqlite";
string dbPath = Path.Combine (Android.OS.Environment.ExternalStorageDirectory.T oString (), dbName);
// Check if your DB has already been extracted.
if (!File.Exists(dbPath))
{
using (BinaryReader br = new BinaryReader(Assets.Open(dbName)))
{
using (BinaryWriter bw = new BinaryWriter(new FileStream(dbPath, FileMode.Create)))
{
byte[] buffer = new byte[2048];
int len = 0;
while ((len = br.Read(buffer, 0, buffer.Length)) > 0)
{
bw.Write (buffer, 0, len);
}
}
}
}
و در ادامه
}
public class TestTable
{
[PrimaryKey, AutoIncrement]
public int Code { get; set; }
public string Title { get; set; }

}



using (var conn = new SQLite.SQLiteConnection(dbPath))
{
var cmd = new SQLite.SQLiteCommand (conn);
cmd.CommandText = "select * from TestTable";
var r = cmd.ExecuteQuery<TestTable> ();

Console.Write (r);
}
با این کد مشکلتون حل میشه.

sara_traveler
یک شنبه 27 دی 1394, 12:46 عصر
من تبلت روت کردم اما باز هم فایل ها در مسیر data\data \دیده نمیشه
چکار باید بکنم؟