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

مشکل با استفاده از دیتابیس و سورس آماده (حل شد)

Delna  9 سال پیش  9 سال پیش
0 0

سلام دوستان.یه نرم افزار دیکشنری پزشکی هست که من خواستم از دیتابیسش و سورسش برای برنامه یه قسمت از برنامه خودم استفاده کنم.چون تا بحال از دیتابیس و لیست ویو و آرایه ها همزمان استفاده نکردم نتونستم از فیلم های استاد هم برای این قسمت ها استفاده کنم و به هم ربطشون بدم.

این برنامه یه دیتابیس داره که تو پوشهassest تبدیل به چهار فایل با فرمت های 0,1,2,3 ذخیره شده که دلیلش نمیدونم.مثلا فرمت یکیشون تو پوشه assest به این صورته appdata.1.اما موقعی که فایل دیتابیس داخل حافظه ذخیره میکنه یه فایل بدون فرمت میسازه که من براش فرمت sqlite گذاشتم و با sqlite manager  که استاد معرفی کردن تونستم بازش کنم.

داخل این برنامه هم دو سورس کد به نام های DictManager.Java و DictMain.Java هستش.DictManager تقریبا یه کلاس شبیه کلاس G هست برای معرفی دیتابیس که من بعد از کپی کردنش مشکل خاصی برام ایجاد نکرد.اما مشکل اصلی DictMain هست که ارور های زیادی از کدش میگیره.سورس کد هر دو رو میزارم دوستان لطفا کمک کنم.در ضمن با لایوتاش هیچ مشکلی ندارم.

کلاس DictManager :

 import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;
import java.io.File;
import java.util.ArrayList;

public class DictManager
{
private static final String DB_NAME = "appdata";
private static final String DB_PATH = "data/MedicalAbbreviationDict/";
private static final String ROOT_DIR = Environment.getExternalStorageDirectory().getAbsolutePath();
private SQLiteDatabase mDb = SQLiteDatabase.openDatabase(new File(new StringBuilder(String.valueOf(ROOT_DIR)).append(File.separator).append("data/MedicalAbbreviationDict/").toString()).getAbsolutePath() + File.separator + "appdata", null, 0);

public DictManager(Context paramContext)
{
}

public String getDesc(int paramInt)
{
SQLiteDatabase localSQLiteDatabase = this.mDb;
String[] arrayOfString = new String[1];
arrayOfString[0] = Integer.toString(paramInt);
Cursor localCursor = localSQLiteDatabase.rawQuery("SELECT desc FROM dict WHERE id = ?", arrayOfString);
localCursor.moveToFirst();
return localCursor.getString(0);
}

public String getEntry(int paramInt)
{
SQLiteDatabase localSQLiteDatabase = this.mDb;
String[] arrayOfString = new String[1];
arrayOfString[0] = Integer.toString(paramInt);
Cursor localCursor = localSQLiteDatabase.rawQuery("SELECT entry FROM dict WHERE id = ?", arrayOfString);
localCursor.moveToFirst();
return localCursor.getString(0);
}

public ArrayList<Integer> search(String paramString)
{
ArrayList localArrayList = new ArrayList();
Cursor localCursor;
int i ;
if (paramString.length() > 0)
{
SQLiteDatabase localSQLiteDatabase = this.mDb;
String[] arrayOfString = new String[1];
arrayOfString[0] = "id";
localCursor = localSQLiteDatabase.query("dict", arrayOfString, "idx_key like '" + paramString.toLowerCase() + "%'", null, null, null, null);
localCursor.moveToFirst();
i = localCursor.getCount();
}
for (int j = 0; ; j++)
{
if (j >= i) //تنها اشکال این سورس این بود که درخواست مقدار دهی برای iرا میکرد با مقداردهی مشکل حل شد.
return localArrayList;
localArrayList.add(Integer.valueOf(localCursor.getInt(0))); //تنها اشکال این سورس این بود که درخواست مقدار دهی برای localCursor را میکرد با مقداردهی مشکل حل شد.
localCursor.moveToNext();
}
}

 کلاس DictMain :

 import android.app.Activity;
import android.content.Context;
import android.content.res.AssetManager;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.Environment;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import com.google.android.gms.ads.AdRequest.Builder; // این کد مربوط به کتابخانه تبلیغات گوگل است که به محض پاک کردن از قسمت های ذکر شده در پایین ایراد میگیرد
import com.google.android.gms.ads.AdView; //این کد مربوط به کتابخانه تبلیغات گوگل است که به محض پاک کردن از قسمت های ذکر شده در پایین ایراد میگیرد
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class DictMain extends Activity
{
private static final String DB_NAME = "appdata";
private static final String DB_PATH = "data/MedicalAbbreviationDict/";
private static final String ROOT_DIR = Environment.getExternalStorageDirectory().getAbsolutePath();
private static final String ROOT_DIR_OLD = "/data/data/megaup.MedicalAbbreviationDict/";
DictManager dict;
private ArrayList<Integer> search_id_list;
private ListView search_list;
private SearchArrayAdapter search_list_adapter;

private static void initialize(Context paramContext)
{
try
{
File localFile1 = new File("/data/data/megaup.MedicalAbbreviationDict/databases/appdata");
if (localFile1.exists())
localFile1.delete();
new File(ROOT_DIR + File.separator + "data/MedicalAbbreviationDict/").mkdirs();
File localFile2 = new File(ROOT_DIR + File.separator + "data/MedicalAbbreviationDict/" + "appdata");
if (localFile2.length() <= 0L)
{
AssetManager localAssetManager = paramContext.getResources().getAssets();
InputStream[] arrayOfInputStream = new InputStream[4];
BufferedInputStream[] arrayOfBufferedInputStream = new BufferedInputStream[4];
int i = 0;
BufferedOutputStream localBufferedOutputStream;
byte[] arrayOfByte;
if (i >= arrayOfInputStream.length)
{
localFile2.createNewFile();
localBufferedOutputStream = new BufferedOutputStream(new FileOutputStream(localFile2));
arrayOfByte = new byte[1024];
}
for (int j = 0; ; j++)
{
if (j >= arrayOfInputStream.length)
{
return;
// arrayOfInputStream[i] = localAssetManager.open("appdata." + i); //با حذف تبلیغات گوگل از این بخش ایراد میگیرد
// arrayOfBufferedInputStream[i] = new BufferedInputStream(arrayOfInputStream[i]);
// i++;
// break;
}
int k;
do
{
// localBufferedOutputStream.write(arrayOfByte, 0, k); //با حذف تبلیغات گوگل درخواست مقداردهی به این عناصر این خطوط را میکند
// k = arrayOfBufferedInputStream[j].read(arrayOfByte, 0, 1024); //با حذف تبلیغات گوگل درخواست مقداردهی به این عناصر این خطوط را میکند
}
while (k != -1);
// localBufferedOutputStream.flush(); //با حذف تبلیغات گوگل درخواست مقداردهی به این عناصر این خطوط را میکند
}
}
}
catch (IOException localIOException)
{
localIOException.printStackTrace();
}
}

public void onCreate(Bundle paramBundle)
{
super.onCreate(paramBundle);
setContentView(2130903041);
initialize(this);
this.dict = new DictManager(this);
((EditText)findViewById(2131165207)).addTextChangedListener(new TextWatcher()
{
public void afterTextChanged(Editable paramEditable)
{
}

public void beforeTextChanged(CharSequence paramCharSequence, int paramInt1, int paramInt2, int paramInt3)
{
}

public void onTextChanged(CharSequence paramCharSequence, int paramInt1, int paramInt2, int paramInt3)
{
DictMain.this.search_id_list.clear();
DictMain.this.search_id_list.addAll(DictMain.this.dict.search(paramCharSequence.toString()));
DictMain.this.search_list_adapter.notifyDataSetChanged();
}
});
this.search_id_list = new ArrayList();
this.search_list_adapter = new SearchArrayAdapter(this, 17367043, this.search_id_list); //ایراد این خط با برداشتن this برداشته میشود
this.search_list = ((ListView)findViewById(2131165208));
this.search_list.setAdapter(this.search_list_adapter);
}

private class SearchArrayAdapter extends ArrayAdapter<Integer>
{
private ArrayList<Integer> items;

public SearchArrayAdapter(int paramArrayList, ArrayList<Integer> arg3)
{
super(i, localList); // اشکال در این خط می گیرد که از هر دو عنصر سوپر ایراد میگیرد که میگه این عناصر به عنوان فیلد یا پارامتر معرفی کن.
this.items = localList; // همانند خط بالا از لوکال لیست ایراد میگیرد.
}

public View getView(int paramInt, View paramView, ViewGroup paramViewGroup)
{
View localView = paramView;
if (localView == null)
localView = ((LayoutInflater)DictMain.this.getSystemService("layout_inflater")).inflate(2130903040, null);
int i = ((Integer)this.items.get(paramInt)).intValue();
((TextView)localView.findViewById(2131165204)).setText(DictMain.this.dict.getEntry(i));
((TextView)localView.findViewById(2131165205)).setText(DictMain.this.dict.getDesc(i));
return localView;
}
}

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

0 0
خطاهای Log رو هم بزارید، اینطوری بهتره ! (9 سال پیش)
0 0
خطوطی که جلوشون فارسی نوشتم مخصوصا دوتای آخر اصلا نمیزارن برنامه اجرا بشه که بخوان لوگ بگیرم. (9 سال پیش)
0 0
خب شما اصلأ localList در هیچ جا تعریف نکردین item رو هم بریزین داخل localList بهتره ! (9 سال پیش)
+2 0
معمولا از سورس کدی که حاصل دیکامپایل هست برای یادگیری تکنیک ها و روشها استفاده میشه (البته از دید مثبت)، نه اینکه همونو بخواییم دوباره با چند تا تغییر قابل استفادش بکنیم، با توجه به کامنت هایی هم که گذاشتید به نظرم بهتره آموزشها رو جدی تر و بیشتر مطالعه و مسلط بشین، تا بتونین از این کدها استفاده کنید، برای مثال شما هنوز مفهوم Constructor رو متوجه نشدید. البته همه اولش بلد نیستن با تلاش و تمرین یاد میگیرن. (9 سال پیش)
0 0
مباحث استاد مطالعه کردم اما همونطور که گفتم نمیتونم بین دیتابیس و آرایه و لیست ویو ارتباط برقرار کنم که خودم بخوام واسش کد بزنم برای همین مجبور شدم از این کد استفاده کنم.حالا نمیدونم locallist و i رو کجا و چطور معرفی کنم.تو سورس خود سازنده همین کد بود که جایی معرفی نشده بود. (9 سال پیش)
+3 0
مطالعه کردن با یادگرفتن و درک کردن فرق داره به نظرم، با توجه به تجربه خودم بهتره این کدها رو فعلا بزارید کنار، خودتون دست به کار بشید، ListView در ساده ترین حالت یه آرایه میخواد، شما اول کار با دیتابیس رو خوب یاد بگیرید بعد میتونید یه آرایه ازش بیرون بکشید بدید به ListView و تمام، شما اگر این مراحل رو شروع کنید و سوال براتون پیش بیاد زودتر به جواب میرسید تا اینکه بتونید ایراد های این سورس کد رو رفع کنید. امیدوارم سوءتفاهم نشه، نیّتم خیر بود :) (9 سال پیش)
+2 0
تمام فایل هارو میشه خورد کرد. ابزار های زیادی برای خورد کردن فایل ها (تبدیل به چند فایل با پسوند های 0،1،2،3) هست، ابزار های زیادی هم برای چسبوندن اینا هست. اول از همه اینو بگم که استفاده از دیتابیس و سورس برنامه های دیگران کار درستی نیست و پیشنهاد میکنم اینکارو نکنید. ممکنه کلی زحمت کشیده باشن برای جمع آوریش. دوم اینکه سنگ بزرگ نشانه نزدنه، به نظرم یک راهی پیدا کنید که با دانش فعلی خودتون پروژه رو بنویسید و یا پروژه رو متوقف کنید و برید مباحث مورد نیاز رو یاد بگیرید و ازشون سمپل بسازید. بعد میتونید انجامش بدید. موفق باشید (9 سال پیش)
+1 0
ممنون از همگی.تقریبا خودم از صفر شروع کردم و به کمک کتابخونه assasetHelper تونستم دیتابیس کپی کنم.آرایه هارم درست کردم تا اونجایی که ArrayAdapter خواستم بسازم که از خواست واسش constructor بسازم.حالا واسه داخل constructor یه Context میخواد با یه resourseID.اولی همون G.Context زدم ولی دومی نمیدونم چی باید بزنم؟ممنون میشم کمکم کنید. (9 سال پیش)
0 0
توی تمام آداپتر ها یک layout وجود داره که باید inflate بشه. اون resourceId، آیدی اون layout هست. شما باید توی xml هاتون یک layout بسازید(که لیست مورد نظر توش نمایش داده بشه) بعد به جای resourceId بزنید R.id.my_layout (9 سال پیش)
 برای این سوال 4 پاسخ وجود دارد.
پاسخ به سوال 
Delna  9 سال پیش
0 0

سلام دوباره به دوستان و ممنون از راهنمایی هاتون.

توصیه های شما باعث شد برم و مطالب استاد و همچنین انجمن درباره دیتابیس و لیست ویو کامل بخونم و تقریبا همه جاشو یاد گرفتم.واسه کپی دیتابیس از کتابخونه AssetHelper که آقای حاج حسینی آموزشش رو داده بودن استفاده کردم و به خوبی تونستم انجامش بدم.چندبار فیلم های استاد دیدم و متوجه کدهایی که تو قسمت قبل نمیدونستم چیه شدم.با توجه به توضیحات فیلم ها و انجمن یه سری کدهارو تغییر دادم تا اینکه به یه مشکل برخوردم که هرچی گشتم نتونستم راه حلی واسش پیدا کنم.مشکل اینه که از خط سرچ قسمت onTextChanged خطا میگیرد به این صورت که برنامه اجرا میشود اما به محض زدن یه حرف برای سرچ برنامه کرش میکند.لوگ کت که نگاه کردم خطای nullPointerExeption از خط سرچ میگیره.یکی از دوستان این مشکل تو انجمن مطرح کرده بود و به جواب رسیده بود اما چون نصف کدهاش قرار نداده بود نتونستم بفهمم مشکل از کجاست.کدهام پایین قرار میدم.ممنون میشم دوستان بگن عیب کار کجاست.

کلاس DictManager که کدهای خواندن از روی دیتابیس و کوئری در آن قرار دارد.

 public class DictManager {



public static SQLiteDatabase database;
public static final String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
public static String DIR_APP = DIR_SDCARD + "/Anaesthesist Assisstant";

public void DictManager(Context paramContext)
{
}

public String getDesc(int paramInt)
{
SQLiteDatabase localSQLiteDatabase = this.database;
String[] arrayOfString = new String[1];
arrayOfString[0] = Integer.toString(paramInt);
Cursor localCursor = localSQLiteDatabase.rawQuery("SELECT desc FROM dict WHERE id = ?", arrayOfString);
localCursor.moveToFirst();
return localCursor.getString(0);
}

public String getEntry(int paramInt)
{
SQLiteDatabase localSQLiteDatabase = this.database;
String[] arrayOfString = new String[1];
arrayOfString[0] = Integer.toString(paramInt);
Cursor localCursor = localSQLiteDatabase.rawQuery("SELECT entry FROM dict WHERE id = ?", arrayOfString);
localCursor.moveToFirst();
return localCursor.getString(0);
}

public ArrayList<Integer> search(String paramString) //متد سرچ که از آن خطا میگیرد این متد است
{
ArrayList localArrayList = new ArrayList();
Cursor localCursor = null;
int i = 0 ;
if (paramString.length() > 0)
{
SQLiteDatabase localSQLiteDatabase = this.database;

String[] arrayOfString = new String[1];
arrayOfString[0] = "id";
localCursor = localSQLiteDatabase.query("dict", arrayOfString, "idx_key like '" + paramString.toLowerCase() + "%'", null, null, null, null);
//localCursor = localSQLiteDatabase.rawQuery("SELECT * FROM dict WHERE idx_key LIKE '" + paramString.toLowerCase() + "%'", null);

localCursor.moveToFirst();
i = localCursor.getCount();
}
for (int j = 0; ; j++)
{
if (j >= i)
return localArrayList;
localArrayList.add(Integer.valueOf(localCursor.getInt(0)));
localCursor.moveToNext();
}
}


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

 public class MainActivity extends Activity {

public static final String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
public static String DIR_APP = DIR_SDCARD + "/Anaesthesist Assisstant";

static DictManager dict;
// public ArrayList<StructNote> notes = new ArrayList<StructNote>();
public ArrayList<StructNote> notes;
private ArrayList<Integer> search_id_list;
private ListView search_list;
private SearchArrayAdapter search_list_adapter;
public ArrayAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);


MainActivity.this.search_id_list = new ArrayList();
MainActivity. this.search_list_adapter = new SearchArrayAdapter(this.search_id_list);
MainActivity. this.search_list = ((ListView)findViewById(R.id.result_list));
MainActivity. this.search_list.setAdapter(this.search_list_adapter);

/*MainActivity.this.notes = new ArrayList();
MainActivity. this.adapter = new ArrayAdapter(G.context, R.layout.adapter_notes, this.notes);
MainActivity. this.search_list = ((ListView)findViewById(R.id.result_list));
MainActivity. this.search_list.setAdapter(this.adapter);*/

//MyDataBase = new DictManager(this);

//this.dict = new DictManager();

//adapter = new AdapterNote(notes);
//search_list.setAdapter(adapter);




final EditText edt = (EditText) findViewById(R.id.query_edit);

edt.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {

MainActivity.this.search_id_list.clear();
MainActivity.this.search_id_list.addAll(MainActivity.this.dict.search((cs).toString())); //خطای نال پوینتر اکسپشن را از این خط میگیرد.
MainActivity.this.search_list_adapter.notifyDataSetChanged();
}

@Override
public void beforeTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {}

@Override
public void afterTextChanged(Editable cs) {

}
});



}

private class SearchArrayAdapter extends ArrayAdapter<Integer>{

private ArrayList<Integer> items;

public SearchArrayAdapter ( ArrayList<Integer> items) {
super(G.context, R.layout.list_row , items);
//this.items = mainActivity;

}


public View getView(int position, View convertView, ViewGroup parent)
{
View localView = convertView;
if (localView == null)
// localView = ((LayoutInflater)MainActivity.this.getSystemService("layout_inflater")).inflate(2130903040, null);
localView = G.inflater.inflate(R.layout.list_row, parent , false);
int i = ((Integer)this.items.get(position)).intValue();
TextView txt1 = (TextView) findViewById(R.id.entryRow);
TextView txt2 = (TextView) findViewById(R.id.entryDesc);
txt1.setText(MainActivity.this.dict.getEntry(i));
txt2.setText(MainActivity.this.dict.getDesc(i));
//((TextView)localView.findViewById(2131165204)).setText(MainActivity.this.dict.getEntry(i));
// ((TextView)localView.findViewById(2131165205)).setText(MainActivity.this.dict.getDesc(i));
return localView;
}



}

private class AdapterNote extends ArrayAdapter<StructNote>{

//static DictManager dict;

private ArrayList<StructNote> items;


public AdapterNote (ArrayList<StructNote> array){
super(G.context , R.layout.adapter_notes , array);
}

private class ViewHolder{
//private ArrayList<StructNote> items;
public TextView txtTitle;
public TextView txtDescription;


public ViewHolder(View view){

txtTitle = (TextView) view.findViewById(R.id.txtTitle);
txtDescription = (TextView) view.findViewById(R.id.txtDescription);

}

public void fill(ArrayAdapter<StructNote> adapter , StructNote item, int position){
txtTitle.setText(item.title);
txtDescription.setText(item.description);

}
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder;

StructNote item = getItem(position);

if (convertView == null){
convertView= G.inflater.inflate(R.layout.adapter_notes, parent , false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}else {

holder = (ViewHolder) convertView.getTag();
}

holder.fill(this, item, position);
return convertView;
}

}


}

دوستان اهل فن خواهشا کمک کنن.هرچی سرچ کردم دیگه نتونستم از این خطا رد شم.

 
0 0
یه سرچ تو اینترنت زدم و دیدم که بعضی ها هم که این مشکل داشتن متد getReadableDatabase تو کداشون نداشتن.نمیدونم مشکل مال منم اینجاست یا نه ولی من هرچه قدر تلاش کردم که از این متد استفاده کنم اصلا همچین متدی وجود نداره و وقتی دستی واردش میکنم میگه داری متد استاتیک به غیر استاتیک ربط میدی و ازش خطا میگیره.اینم یه سوال شبیه مال من که اینجوری مشکلش حل شده ولی مال من نه لینک (9 سال پیش)
0 0
با توجه به این کدهایی که قرار دادید توی کلاس DictManager متغیر database اصلا مقدار دهی نشده، متد getReadableDatabase مربوط به کلاس SQLIteOpenHelper هست که یه شی SQLiteDatabase برمیگردونه، از کلاسی که مربوط به کتابخونه AssetHelper هست (اسم دیتابیس و نسخه اون رو داخلش نوشتید) یه نمونه بسازید و با اون database رو مقدار دهی کنید (اون کلاس از SQLIteOpenHelper مشتق (Extend) شده). (9 سال پیش)
0 0
ممنون از شما.متد getReadableDatabase همونطور که فرمودید داخل کلاس DataBaseHelper وجود داشت که از SQLIteOpenHelper مشتق شده بود.اما دقیقا منظورتون از مقداردهی دیتابیس متوجه نشدم.این سورس من یه کلاس G و یه کلاس DataBaseConnection هم داره که از SQLiteAssetHelper مشتق شده.داخل کلاس G من خیلی از دستورات نظیر ساخت دایرکتوری و روopenOrCreate رو دادم.این برنامه موقع اجرا از متد سرچ DictManager خطا میگیره که جلوش فارسی کامنت کردم کدوم متده.اما متوجه نمیشم منظورتون از مقداردهی چیه؟؟؟ (9 سال پیش)
پاسخ به سوال 
Spirit  9 سال پیش
+3 0

DataBaseConnection dbConection = new DataBaseConnection(context);
SQLiteDatabase database = dbConection.getReadableDatabase();
پاسخ به سوال 
Delna  9 سال پیش
0 0

ممنون از همه به خصوص آقای نصرتی.من حتی این کدبالا که شما فرمودین نوشتم اما باز هم همون مشکل وجود داره.

مجبور شدم اون کلاس DictManager حذف کنم و متدهای دیتابیس بیارم تو اکتیویتی اصلی که بتونم کد بالا رو بزارم براش اما بازم نشد.تمام کلاسام میزارم براتون.بی زحمت یه نگاه بندازین بهش.تمام این کدهارو دیگه میتونم به واقع بگم خودم جمع کردم و هیچ شباهتی به اون سورس دیکامپایل شده اول نداره.

کلاس DataBaseConnection :

 public class DataBaseConnection extends SQLiteAssetHelper {

public DataBaseConnection(Context context, String name, int version) {
super(context, name, null, version);

setForcedUpgradeVersion(version);
}
public SQLiteDatabase appdata() {
SQLiteDatabase appdata = null;
return appdata();
}

کلاس DataBaseHelper :

 public class DataBaseHelper extends SQLiteOpenHelper{

public static final String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();

public static String DIR_APP = DIR_SDCARD + "/Anaesthesist Assisstant";


private static String DB_PATH = DIR_APP + "/appdata.DB";


private static String DB_NAME = "appdata.DB";

private SQLiteDatabase database;

private final Context Context;


public DataBaseHelper(Context context) {

super(context, DB_NAME, null, 1);
this.Context = context;
}

public void createDataBase() throws IOException{

boolean dbExist = checkDataBase();

if(dbExist){


}else{


this.getReadableDatabase();

try {

copyDataBase();

} catch (IOException e) {

throw new Error("Error copying database");

}
}

}




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;
}




private void copyDataBase() throws IOException{

InputStream myInput = Context.getAssets().open(DB_NAME);

String outFileName = DB_PATH + DB_NAME;

OutputStream myOutput = new FileOutputStream(outFileName);

byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}

myOutput.flush();
myOutput.close();
myInput.close();

}

public void openDataBase() throws SQLException{

String myPath = DB_PATH + DB_NAME;
database = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

}

@Override
public synchronized void close() {

if(database != null)
database.close();

super.close();

}

@Override
public void onCreate(SQLiteDatabase db) {

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

کلاس G :

 public class G extends Application {

public static Context context;
public static LayoutInflater inflater;
public static Handler HANDLER = new Handler();
public static Activity currentActivity;
public static SQLiteDatabase database;
public static final String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
public static String DIR_APP = DIR_SDCARD + "/Anaesthesist Assisstant";


@Override
public void onCreate() {

super.onCreate();
context = getApplicationContext();
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

new File(DIR_APP).mkdirs();



prepareDB();

}

private boolean prepareDB() {

try {
String state = Environment.getExternalStorageState();
InputStream is = context.getAssets().open("appdata.DB");

if (state.equals(Environment.MEDIA_MOUNTED))
{

File DB_PATH = new File(DIR_APP + "/appdata.DB");

Log.i("DB_PATH", "DB_PATH=" + DB_PATH);

if (DB_PATH.exists()) {

database = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null);
Log.i("database", "database=" + database);

return true;

}
else {

if (copy(new FileOutputStream(DB_PATH), is)) {
database = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null);
return true;
}
else {
return false;
}
}
}
else {
Log.i("abcdefg", "state=" + state);
DIR_APP = getFilesDir().toString();
File dbFile = new File(getFilesDir().toString() + "/" + "/appdata.DB");
if (dbFile.exists()) {
database = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
return true;
}
else {
FileOutputStream os = openFileOutput("appdata.DB", context.MODE_PRIVATE);
if (copy(os, is)) {
database = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
return true;
}
else {
return false;
}
}
}
}
catch (Exception e) {
e.printStackTrace();
return false;
}
}


private boolean copy(OutputStream os, InputStream is) {
try {
int readed = 0;
byte[] buffer = new byte[8 * 1024];
while ((readed = is.read(buffer)) > 0) {
os.write(buffer, 0, readed);
}
try {
is.close();
}
catch (Exception e) {
e.printStackTrace();
}
try {
os.flush();
}
catch (Exception e) {
e.printStackTrace();
}
try {
os.close();
}
catch (Exception e) {
e.printStackTrace();
}
return true;
}
catch (Exception e) {
e.printStackTrace();
return false;
}
}

کلاس ActivityMain که از متد searchAndShow که در onTextChanged ایراد میگیرد.کد آقای نصرتی را هم من در این قسمت قرار دادم و کدهای کلاس DictManager را هم خلاصه کردم و اینجا گزاشتم.

 public class ActivityMain extends Activity {

public static final String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
public static String DIR_APP = DIR_SDCARD + "/Anaesthesist Assisstant";

public ArrayList<StructNote> notes;
private ListView search_list;
public ArrayAdapter adapter;
public EditText edt;

DataBaseHelper dbHelper = new DataBaseHelper(G.context);
SQLiteDatabase database = dbHelper.getReadableDatabase();



@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);


ActivityMain.this.notes = new ArrayList();
ActivityMain. this.adapter = new ArrayAdapter(G.context, 0, this.notes);
ActivityMain. this.search_list = ((ListView)findViewById(R.id.result_list));
ActivityMain. this.search_list.setAdapter(this.adapter);




edt = (EditText) findViewById(R.id.query_edit);


edt.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {

searchAndShow();


}

@Override
public void beforeTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {}

@Override
public void afterTextChanged(Editable cs) {

}
});



}

private void searchAndShow() {

edt = (EditText) findViewById(R.id.query_edit);
String word =edt.getText().toString();


ActivityMain.this.notes.clear();
Cursor cursor = database.rawQuery("SELECT * FROM dict WHERE idx_key LIKE '" + word + "%'", null);
while (cursor.moveToNext()) {
StructNote structData= new StructNote();
structData.title = cursor.getString(cursor.getColumnIndex("entry"));
structData.description = cursor.getString(cursor.getColumnIndex("desc"));

this.notes.addAll(notes);

}
cursor.close();
adapter.notifyDataSetChanged();

}

private class AdapterNote extends ArrayAdapter<StructNote>{


private ArrayList<StructNote> items;


public AdapterNote (ArrayList<StructNote> array){
super(G.context , R.layout.adapter_notes , array);
}

private class ViewHolder{
public TextView txtTitle;
public TextView txtDescription;


public ViewHolder(View view){

txtTitle = (TextView) view.findViewById(R.id.txtTitle);
txtDescription = (TextView) view.findViewById(R.id.txtDescription);

}

public void fill(ArrayAdapter<StructNote> adapter , StructNote item, int position){
txtTitle.setText(item.title);
txtDescription.setText(item.description);

}
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder;

StructNote item = getItem(position);

if (convertView == null){
convertView= G.inflater.inflate(R.layout.adapter_notes, parent , false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}else {

holder = (ViewHolder) convertView.getTag();
}

holder.fill(this, item, position);
return convertView;
}

}


}

یه کلاس StuctNote هم هست که درست شبیه پروژه استاد درست کردم.

فقط تو رو خدا اگه میتونید جوابم بدید چون دقیق دوهفتس سر این یه کد موندم.باتشکر از همه.

0 0
دوستان کسی جواب مارو نمیده؟؟؟ (9 سال پیش)
پاسخ به سوال 
Delna  9 سال پیش
0 0

سلام دوباره به همه دوستان.خوشبختانه اون مشکل nullPointerExeption حل شد.مشکل همون جایی بود که آقای نصرتی میفرمودند.حالا من به یه مشکل جدید برخورد کردم.دیتابیس به درستی کپی میشه.موقع خوندنش هم خطای nullpointer نمیده پس وجود داره.اما موقعی که میخوام ازش کوئری بگیرم خطای No Such Table میده و میگه همچین تیبلی با این نام وجود نداره در صورتی که نام تیبل و اونی که تو کوئری بهش گفتم بخون دقیقا یکین.فکر میکردم دیتابیس خالی کپی شده اما توی امولیتور که نگاه کردم حجمش همونه.من از امولیتور nox استفاده میکنم.ولی توی گوشی هم که امتحان کردم این مشکل وجود داشت.

کلاس ActivityMain که از متد SerachAndShow آن ایراد میگیرد.

 public class ActivityMain extends Activity{


public ArrayList<StructNote> notes = new ArrayList<StructNote>();
public ArrayAdapter adapter;
DataBaseHelper dbHelper = new DataBaseHelper(G.context);
public ListView list;
public SQLiteDatabase database;
public EditText edt;
public String word;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

list = (ListView) findViewById(R.id.result_list);

adapter = new AdapterNote(notes);
list.setAdapter(adapter);


edt = (EditText) findViewById(R.id.query_edit);

edt.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {

word =edt.getText().toString();
searchAndShow();

}

@Override
public void beforeTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {}

@Override
public void afterTextChanged(Editable cs) {


}
});




}

private void searchAndShow() {



database = dbHelper.getReadableDatabase();
//database.OPEN_READONLY;
notes.clear();
Cursor cursor = database.rawQuery("SELECT * FROM dict WHERE idx_key LIKE '" + word.toLowerCase() + "%'", null);
while (cursor.moveToNext()) {
StructNote structData= new StructNote();
structData.title = cursor.getString(cursor.getColumnIndex("entry"));
structData.description = cursor.getString(cursor.getColumnIndex("desc"));

notes.add(structData);

}
cursor.close();
adapter.notifyDataSetChanged();

}

دوستان کسی میدونه مشکل کار کجاست؟؟؟ممنون میشم پاسخ بدین

 
0 0
دوستان کسی نیست جواب مارو بده.تو سایت stackoverflow گفته بودن که این مشکل nu such table به سه تا دلیل ممکنه بوجود بیاد.اول اینکه قصد اضافه کردن تیبل به دیتابیست داشته باشی با متدexcsqlکه من اصلا همچین کدی ندارم.دوم اینکه ورژن قبلی دیتابیست نصب باشه که من چند بار کل نرم افزار از رو امولیتور پاک کردم ولی مشکل حل نشد.کلا دیتابیس من فقط خوندیه و اصلا نیازی به آپدیتش وجو نداره.سومم اینکه دیتابیس خالی کپی بشه که من دیتابیس کشیدم بیرون ولی هم حجمش درست بود هم تیبل و هم ستون هاش.هرکی میدونه لطفا بگه عیب کار کجاست (9 سال پیش)
0 0
دوستان با کمک آقای نصرتی مشکل حل شد.تشکر میکنم ازشون. (9 سال پیش)

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