بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

مشکل با ذخیره sqlite روی گوشی

مدیریت گفتگو
alireza71 11 سال پیش
آخرین تغییر: 11 سال پیش

من یه برنامه دارم که یه لیست ویو از sqlite تغذیه میشه.حالا مشکلم اینه که برنامه به طور کامل و درست روی جنی موشن اجرامیشه اما رو گوشی یا کرش میکنه یا داخل لیست ویو به جای مقدار ها null برمیگردونه.بعد از کلی سرو کله زدن فهمیدم گوشی اصلا  فایل دیتا بیس رو نمیتونه بخونه و کرش میکنه  اخطار nullpointerexeption میده.من دیتا بیسی رو که جنی موشن ساخته رو به صورت دستی کپی میکنم روی گوشی و برنامه درست میشه و کار میکنه. برنامه رو هم روی گوشی های با sd وبدون sd امتحان کردم که بعد از این کپی کردن درست میشه. قسمت دیتا بیس هم مثل مثال استاد هست.

حالا چیکار کنم که نیاز به این کپی دستی نباشه؟

داخل انجمن هم سرچ کردم ولی یا به نتیجه نرسیدم یا اونهایی هم که بودن ناقص جواب داده شده بودن.

نظرات

میلاد 11 سال پیش
دوست عزیز اگه زحمت نمیشه کد های مربوط به ساخت دیتا بیستو بفرست . اگه مثل استاد کار کرده باشی کلاس G رو بفرستی باید کافی باشه تا یه نگاهی بندازیم

پاسخ‌ها 2

alireza71 11 سال پیش

 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:

نظرات

میلاد 11 سال پیش
مشکلت اینجاست که وقتی برنامه رو برای بار اول توی گوشی نصب میکنی فقط دیتا بیسو به دستگاه میشناسونی ودیتایی که ساخته میشه خالی هستش بعد میخوای از دیتای خالی مقدار بگیری که چون چیزی توش نیست مقدارش میشه null و تو خط Toast ارور میگیره.وقتی هم که دیتای قبلیتو جای گزینش میکنی چون از قبل با حلقه for مقدار ریختی توش مشکلی پیدا نمیکنه.پس مشکل اصلیت اینه که توی دیتای خالی داری دنبال هیچی میگردی
alireza71 11 سال پیش
ممنون,پس چجوری دیتابیسی که با دیتا پر شده رو به برنامه بشناسونم؟
alireza71 11 سال پیش

درست شد!نحوه کار اینجوریه که باید دیتابیس رو داخل پوشه 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());

}

نظرات


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .