آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

alireza71  11 سال پیش  11 سال پیش
0 0

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

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

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

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

 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:

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

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

}

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