مشکل در اجرای فایل apk
برنامه من یک لیست ویو داره که اطلاعاتش رو از بانک sqlite manager میگیره(مثل پروژه مارکت استاد) برنامه روی emulator خودم به درستی اجرا میشه ولی نمی دونم چرا وقتی فایل apk رو برای استادم میل میکنم روی emulator اون نصب واجرا نمیشه نمی دونم باید چیکار کنم ؟ اگه راهنمایی کنید ممنون میشم.
نسخه خروجی گرفته شده برنامه apk ممکنه بالاتر از نسخه emulator استادت باشه ، به همین دلیل استادت نمیتونی این برنامه رو ، روی گوشی یا emulator نصب کنه
من پیشتهاد میکنم فایل APK رو زیپ کنید و بعد ارسال کنید ، چون دیتابیس رو توی خود برنامه میسازید ، پس در امولاتور استادتون هم خود به خود ساخته میشه ، پس نیازی به کپی ندارید ، ولی با توجه به تجربه شخصی من ، خیلی وقت ها آپلود فایل های برنامه ها با مشکل مواجه میشه ، شما میتونید ایمیل تون رو عوض کنید و یا توی دراپ باکس یا یک آپلود سنتر دیگه فایلتون رو آپلود کنید.
برای تست یکبار هم برنامه رو از توی امولاتور پاک کنید و بعد نصب کنید تا ببینید دیتابیس به طور صحیح ساخته میشه یا نه ( پاک کردن برنامه باعث میشه دیتابیس هم پاک بشه ولی f5 خالی زدن دیتابیس رو پاک نمیکنه ) ، و در آخر از استادتون بپرسید که کجا خطا رو مشاهده میکنه؟ ( اصلا برنامه نصب میشه؟ یا پس از نصب و اجرا خطا میده؟ یا زمانی که دیتابیس ساخته میشه؟ یا ... )
package com.uncocoder.course.app.country;
import java.io.File;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;
import android.os.Handler;
import android.view.LayoutInflater;
public class G extends Application {
public static Context context;
public static LayoutInflater inflater;
public static final Handler HANDLER = new Handler();
public static Activity currentActivity;
public static StructApplication selectedApplication;
public static SQLiteDatabase database;
public static final String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
public static final String DIR_DATABASE = DIR_SDCARD + "/android-country/";
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
new File(DIR_DATABASE).mkdirs();
managedatabase();
}
private void managedatabase() {
database = SQLiteDatabase.openOrCreateDatabase(DIR_DATABASE + "/database.sqlite", null);
database.execSQL("CREATE TABLE IF NOT EXISTS contry (" +
"contry_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE , " +
"contry_persion TEXT, " +
"contry_english TEXT, " +
"contry_flag TEXT, " +
"contry_map TEXT, " +
"contry_gomhore TEXT, " +
"contry_paitagt TEXT, " +
"contry_languge TEXT, " +
"contry_hokomat TEXT, " +
"contry_masahat INTEGER, " +
"contry_gameyat INTEGER, " +
"contry_shoar TEXT, " +
"contry_pol TEXT, " +
"contry_net TEXT, " +
"contry_pretel INTEGER, " +
"contry_phonenumber TEXT, " +
"contry_email TEXT " +
")");
}
}
شما دیتا بیس رو کپی نمیکنید روی sdcard گوشی واسه همین اطلاعات شما رو نشون نیمده
اگر همون اول سوال رو کامل نوشته بودید و یا سوالات من رو کامل جواب داده بودید جواب کامل میدادم .
تمام موارد زیر رو مرحله به مرحله انجام بدید:
1 : اضافه کردن یک کلاس به کلاس هاتون و کپی کردن کد های زیر توی اون کلاس
public class DataBaseConnection extends SQLiteOpenHelper {
private static String DATABASE_NAME = "tale_rouzane.sqlite";
public final static String DATABASE_PATH = "/data/data/ir.hajhosseinico.tale_rouzane/databases/";
private static final int DATABASE_VERSION = 1;
private final Context dbContext;
public DataBaseConnection(Context context) throws SQLException {
super(context, ActivitySource.DatabaseName, null, DATABASE_VERSION);
this.dbContext = context;
if (checkDataBase() == false) {
try {
this.getReadableDatabase();
copyDataBase();
this.close();
}
catch (IOException e) {
throw new Error("Error copying database");
}
} else {
File file = new File(DATABASE_PATH + DATABASE_NAME);
file.delete();
Log.i("LOG", "existed file deleted ");
try {
this.getReadableDatabase();
copyDataBase();
Log.i("LOG", "existed file copyed ");
this.close();
}
catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private void copyDataBase() throws IOException {
Log.i("LOG", "copy db login");
InputStream myInput = dbContext.getAssets().open(DATABASE_NAME);
String outFileName = DATABASE_PATH + DATABASE_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
Log.i("LOG", "copy db out");
myOutput.flush();
myOutput.close();
myInput.close();
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
checkDB = SQLiteDatabase.openDatabase(DATABASE_PATH + DATABASE_NAME, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.CREATE_IF_NECESSARY);
checkDB.close();
Log.i("LOG", "check db is true");
}
catch (SQLiteException e) {
Log.i("LOG", "check db is false");
// database doesn't exist yet.
}
return checkDB != null ? true : false;
}
@Override
public void onCreate(SQLiteDatabase arg0) {}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {}
}
توضیحات : این کلاس دیتابیس رو اگر وجود نداشته باشه کپی میکنه ، فقط چند چیز رو باید تغییر بدید :
الف : DATABASE_NAME رو نام دیتابیس خودتون قرار بدید
ب : DATABASE_PATH رو جایگزین کنید
2 : توی کلاس G ( اگر ندارید توی کلاسی که به دیتابیس کانکت میشید ، قبل از کانکت شدن اینو بنویسید ) کد زیر رو بنویسید که در اولین باری که برنامه اجرا میشه دیتابیس کپی بشه ( توجه : به استادتون بگید برنامه رو پاک کنه و دوباره نصب کنه تا مقادیر از اول ست بشه که اگر از SharedPreferences استفاده کردیدجایگزین بشن )
try {
@SuppressWarnings("unused") DataBaseConnection connectToDatabase = new DataBaseConnection(getApplicationContext());
Log.i("LOG", "DataBase Hase Been Initialized");
}
catch (java.sql.SQLException e) {
Log.i("LOG", "DataBase Hase not Initialized");
}
کارهای بالا رو که گفتم انجام بدید ، بعد یک نسخه آپلود کنید ببینیم مشکلتون حل شده یا نه
با سلام
میتونین دیتابیس رو داخل asset قرار بدین و یک کلاس .G تعریف کنین براش خیلی پیچیده نبود به نظرم موفق باشید
import java.io.File;
import android.app.Application;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Environment;
import android.util.Log;
public class G extends Application {
public static SQLiteDatabase database;
public static final String DIR_SDCARD = Environment.getExternalStorageDirectory().getPath();
public static final String DIR_APP = DIR_SDCARD + "/data/files";
public static Context context;
public static void MultipleQueryExec(String sql)
{
String[] separated = sql.split(";;;");
for (String query: separated)
{
try {
database.execSQL(query);
}
catch (SQLiteException e) {
Log.w("NEGANO", e.getMessage().toString());
}
catch (Exception e)
{
Log.w("NEGANO", e.getMessage().toString());
}
}
}
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
new File(DIR_APP).mkdirs();
String query = getResources().getString(R.string.query);
database = SQLiteDatabase.openOrCreateDatabase(DIR_APP + "db.sqlite", null);
try {
Cursor cursor = database.rawQuery("SELECT * FROM content", null);
if (cursor.getCount() < 1)
{
MultipleQueryExec(query);
}
else
{
Log.i("NEGANO", "table content Exist !");
}
cursor.close();
}
catch (SQLiteException e) {
if (e.getMessage().toString().contains("no such table")) {
Log.i("NEGANO", "Creating table content because it doesn't exist!");
MultipleQueryExec(query);
}
}
}
}
ابجی اینم برنامه ات روی هرچیزی نصب میشه میخوای اول رو گوشیت تست کن .دانلود
مشکل در ذخيره ديتابيس در Sdcard : سلام من هم دقيقا به مشکل خ کوثر بخورد کردم 2 روزه کاملا درگيرش هستم و اکثر جولبهاي دوستان در تمام سوالات رو خوندم اما ب نتيجه نرسيدم با اين تفاسير که کلاس HelperIO رو هم گذاشتم در پروژم و در کلاس G بجاي manageDatabase();
اينو گذاشتم : (از سورس اقای UNDEROMEDA . که مساله رو حل کردند ديدم )
try
{
HelperIO.copyFile(localAssetManager.open("database/databasekala.sqlite"), DIR_APP + "/databasekala.sqlite");
manageDatabase();
return;
}
catch (IOException localIOException)
{
while (true)
localIOException.printStackTrace();
}
اما حاصل چيزي نست جز يک صفحه سياه ک بعد مدتي ميشه بستش
ممنون ميشم مرحله به مرحله بگيد چيکار بايد بکنم که ديتابيسي که ايجاد کردم و در محيط eclipse اجرا ميشه چجوري اونو در گوشي واقعي هم اجرا کنم ممنون
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .


