مشکل با ذخیره sqlite روی گوشی
من یه برنامه دارم که یه لیست ویو از sqlite تغذیه میشه.حالا مشکلم اینه که برنامه به طور کامل و درست روی جنی موشن اجرامیشه اما رو گوشی یا کرش میکنه یا داخل لیست ویو به جای مقدار ها null برمیگردونه.بعد از کلی سرو کله زدن فهمیدم گوشی اصلا فایل دیتا بیس رو نمیتونه بخونه و کرش میکنه اخطار nullpointerexeption میده.من دیتا بیسی رو که جنی موشن ساخته رو به صورت دستی کپی میکنم روی گوشی و برنامه درست میشه و کار میکنه. برنامه رو هم روی گوشی های با sd وبدون sd امتحان کردم که بعد از این کپی کردن درست میشه. قسمت دیتا بیس هم مثل مثال استاد هست.
حالا چیکار کنم که نیاز به این کپی دستی نباشه؟
داخل انجمن هم سرچ کردم ولی یا به نتیجه نرسیدم یا اونهایی هم که بودن ناقص جواب داده شده بودن.
package com.uncocoder.course.app.database;
import java.io.File;
import android.app.Application;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
public class G extends Application {
public static Context context;
public static SQLiteDatabase database;
public static final String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
public static final String DIR_DATABASE = DIR_SDCARD + "/database-testali/";
public static String[] str;
public static int i = 0;
public static String name;
public static String family;
public static int age
@Override
public void onCreate() {
super.onCreate();
context = this.getApplicationContext();
new File(DIR_DATABASE).mkdirs();
database = SQLiteDatabase.openOrCreateDatabase(DIR_DATABASE + "/database.sqlite", null);
database.execSQL("CREATE TABLE IF NOT EXISTS person (" +
"person_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE , " +
"person_name TEXT, " +
"person_family TEXT, " +
"person_age INTEGER" +
")");
/*
for (int i = 0; i < 20; i++) {
database.execSQL("INSERT INTO person (person_name,person_family,person_age) VALUES ('Name#" + i + "','Family#" + i + "'," + i + ")");
}
*/
Cursor cursor = database.rawQuery("SELECT * FROM person WHERE person_age>10", null);
while (cursor.moveToNext()) {
name = cursor.getString(cursor.getColumnIndex("person_name"));
family = cursor.getString(cursor.getColumnIndex("person_family"));
age = cursor.getInt(cursor.getColumnIndex("person_age"));
Log.i("LOG", "Record: " + name + " " + family + ", " + age);
str[i] = name;
i++;
}
Toast.makeText(context, "" + str[1], Toast.LENGTH_SHORT).show();
cursor.close();
// database.execSQL("DELETE FROM person WHERE person_age>10");
// database.execSQL("UPDATE person SET person_name='test' WHERE person_age>7");
}
}
مشکل اینجاست که روی خط Toast ارور null میگیره.مشکل وقتی حل میشه که دیتابیس دستی کپی بشه.این کلاس هم همون کلاس استاده d:
درست شد!نحوه کار اینجوریه که باید دیتابیس رو داخل پوشه assets کپی کنیم واز این کد مثلا اول همین کلاس G استفاده کنیم:
و البته فایل های دیتابیس باید کمتر از 1 مگابایت باشه .اگر زیادتر باشه باید از ارایه استفاده کنیم.
try {
InputStream myInput = context.getAssets().open("your db name in assets folder.sqlite");
String outFileName = DIR_DATABASE + "your db name in assets folder.sqlite";
OutputStream myOutput = new FileOutputStream(outFileName);
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();
}
catch (Exception e) {
// Log.i(LOG,"error" + e.toString());
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .