PDA

View Full Version : مشکل در کار بار SQLiteOpenHelper



CRbreeze
یک شنبه 13 دی 1394, 01:09 صبح
سلام خسته نباشید

من یه سوال راجع به متصل کردن SQlite به اندروید استودیو دارم...اگه کمکم کنید ممنون میشم

کدها بصورت زیر هست و زمانیکه دکمه کلیک میشه به تابع namayesh() که میرسه از برنامه خارج میشه....
من خودم فک میکنم که نمیتونه از دیتابیس خارجی بخونه ولی نمیدونم باید چکار کنم...
main:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book_app);
db= new Database(this);
db.usable();
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

db.open();
String str=db.namayesh(0,1,"contents");
Toast.makeText( BookApp.this,str,Toast.LENGTH_SHORT).show();
db.close();
}
});


}

کلاسDatabase

public class Database extends SQLiteOpenHelper {

public final String path="data/data/com.example.pc1.book/data";
public final String Name="database";
public SQLiteDatabase mydb;
public final Context mycontext;


public Database(Context context) {
super(context,"databases",null,1);
mycontext = context;
}


public void usable(){
if(checkdb()){


}else{
this.getReadableDatabase();
try{
copydatabase();
}catch(IOException e){


}
}
}


public void open(){
mydb= openDatabase(path + Name, null, OPEN_READWRITE);




// mydb=openOrCreateDatabase(path+Name, null, null);
// mydb.execSQL("CREATE TABLE IF NOT EXISTS "+TB_USERS +" (ID INTEGER PRIMARY KEY, NAME TEXT, CITY TEXT);");
}
@Override
public void close(){
mydb.close();
}


public boolean checkdb(){
SQLiteDatabase db = null;
try{
db= openDatabase(path + Name, null, OPEN_READONLY);
}catch(Exception e){


}
return db != null ? true : false;
}


public void copydatabase() throws IOException{
OutputStream myOutput= new FileOutputStream("/data/data/com.example.pc1.book/databases/mydb.sqlite");
byte[] buffer = new byte[1024];
int lenght;
InputStream myInput = mycontext.getAssets().open(Name);
while((lenght=myInput.read(buffer))>0){
myOutput.write(buffer,0,lenght);
}
myInput.close();
myOutput.flush();
myOutput.close();
}




public String namayesh(int row,int field,String table){


Cursor allrows = mydb.rawQuery("select * from " + table,null);
allrows.moveToPosition(row);
return allrows.getString(field);
}

CRbreeze
یک شنبه 13 دی 1394, 01:11 صبح
متاسفانه الان سیستمم هنگ کرده نمیره واسه اجرا logcat بذارم

MansoorJ
یک شنبه 13 دی 1394, 08:14 صبح
سلام
فکر کنم مشکل در اینه که Name و فایل کپی شده هم نام نیستند
شما mydb.sqlit کپی میکنید ولی از Name استفاده میکنید.

فک کنم مشکل همین باشه.

CRbreeze
یک شنبه 13 دی 1394, 17:27 عصر
سلام
فکر کنم مشکل در اینه که Name و فایل کپی شده هم نام نیستند
شما mydb.sqlit کپی میکنید ولی از Name استفاده میکنید.

فک کنم مشکل همین باشه.

این کار رو هم انجام دادم دوست عزیز ... اما فرقی نکرد :متفکر: بعد از فشار دادن دکمه از برنامه خارج میشه...

CRbreeze
یک شنبه 13 دی 1394, 17:46 عصر
اینم logcat:
Logcat:
02-02 18:52:57.132: VERBOSE/ProtocolEngine(24): DownloadRate 104166 bytes per sec. Downloaded Bytes 5643/34714
08-03 13:31:16.196: DEBUG/dalvikvm(2227): HeapWorker thread shutting down
08-03 13:31:16.756: INFO/dalvikvm(2234): Debugger is active
08-03 16:26:45.965: WARN/ActivityManager(564): Launch timeout has expired, giving up wake lock!
08-04 16:19:11.166: ERROR/AndroidRuntime(4687): Uncaught handler: thread main exiting due to uncaught exception
08-04 16:24:11.166: ASSERT/Assertion(4687): Expected true but was false

gjmkdyttyhujk
یک شنبه 13 دی 1394, 20:04 عصر
اینم logcat:
Logcat:
02-02 18:52:57.132: VERBOSE/ProtocolEngine(24): DownloadRate 104166 bytes per sec. Downloaded Bytes 5643/34714
08-03 13:31:16.196: DEBUG/dalvikvm(2227): HeapWorker thread shutting down
08-03 13:31:16.756: INFO/dalvikvm(2234): Debugger is active
08-03 16:26:45.965: WARN/ActivityManager(564): Launch timeout has expired, giving up wake lock!
08-04 16:19:11.166: ERROR/AndroidRuntime(4687): Uncaught handler: thread main exiting due to uncaught exception
08-04 16:24:11.166: ASSERT/Assertion(4687): Expected true but was false

لوگ کتتون ناقصه. کاملش رو لطفا بزارید.

CRbreeze
یک شنبه 13 دی 1394, 22:12 عصر
لوگ کتتون ناقصه. کاملش رو لطفا بزارید.

من با لاگ کت کار نکردم تا بحال میشه لطفا بگید کاملشو از کجا باید براتون بذارم؟

gjmkdyttyhujk
یک شنبه 13 دی 1394, 22:35 عصر
من با لاگ کت کار نکردم تا بحال میشه لطفا بگید کاملشو از کجا باید براتون بذارم؟

همونی که کپی کردید رو به صورت کامل کپی کنید.

CRbreeze
یک شنبه 13 دی 1394, 23:48 عصر
همونی که کپی کردید رو به صورت کامل کپی کنید.

همین اندازه بود :

http://uupload.ir/files/g11g_untitled0_thumb.png (http://uupload.ir/viewer.php?file=g11g_untitled0.png)

gjmkdyttyhujk
دوشنبه 14 دی 1394, 01:00 صبح
همین اندازه بود :

http://uupload.ir/files/g11g_untitled0_thumb.png (http://uupload.ir/viewer.php?file=g11g_untitled0.png)

نه این طوری نه.

شما باید داخل اندروید استودیو در قسمت پایین بر روی اندروید کلیک کنید و محتویات داخل اون رو کپی کنید. اینجا منظورمه.
http://s6.picofile.com/file/8231494692/Capture.PNG

CRbreeze
دوشنبه 14 دی 1394, 03:09 صبح
نه این طوری نه.

شما باید داخل اندروید استودیو در قسمت پایین بر روی اندروید کلیک کنید و محتویات داخل اون رو کپی کنید. اینجا منظورمه.
http://s6.picofile.com/file/8231494692/Capture.PNG
خب این قسمت خالیه...بعد از هربار اجرا هم همچنان خالیه:متفکر:

gjmkdyttyhujk
دوشنبه 14 دی 1394, 13:20 عصر
خب این قسمت خالیه...بعد از هربار اجرا هم همچنان خالیه:متفکر:


در عکسی که گذاشتم سمت راست بالا گزینه show only selected application رو به no filter تغییر بده و ببین چیزی نشون میده یا نه. وقتی برنامه خطا داد این کار رو انجام بده.

gjmkdyttyhujk
دوشنبه 14 دی 1394, 14:34 عصر
شما تو عکسی که دادم در قسمت سمت راست بالا گزینه show only selected application رو به no filter تغییر بدید و محتویات نمایش داده شده رو در اینجا قرار بدید.

CRbreeze
دوشنبه 14 دی 1394, 19:49 عصر
خیلی زیاده دوست عزیز اگه بقیه اش هم لازمه بگید بذارم


01-04 07:07:32.524 6171-6171/? E/AndroidRuntime﹕ in writeCrashedAppName, pkgName :com.example.pc1.book01-04 07:07:32.534 6171-6171/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.pc1.book, PID: 6171
android.database.sqlite.SQLiteCantOpenDatabaseExce ption: unknown error (code 14): Could not open database
at android.database.sqlite.SQLiteConnection.nativeOpe n(Native Method)
at android.database.sqlite.SQLiteConnection.open(SQLi teConnection.java:209)
at android.database.sqlite.SQLiteConnection.open(SQLi teConnection.java:193)
at android.database.sqlite.SQLiteConnectionPool.openC onnectionLocked(SQLiteConnectionPool.java:463)
at android.database.sqlite.SQLiteConnectionPool.open( SQLiteConnectionPool.java:185)
at android.database.sqlite.SQLiteConnectionPool.open( SQLiteConnectionPool.java:177)
at android.database.sqlite.SQLiteDatabase.openInner(S QLiteDatabase.java:804)
at android.database.sqlite.SQLiteDatabase.open(SQLite Database.java:789)
at android.database.sqlite.SQLiteDatabase.openDatabas e(SQLiteDatabase.java:694)
at android.database.sqlite.SQLiteDatabase.openDatabas e(SQLiteDatabase.java:669)
at com.example.pc1.book.Database.open(Database.java:4 7)
at com.example.pc1.book.BookApp$1.onClick(BookApp.jav a:30)
at android.view.View.performClick(View.java:4443)
at android.view.View$PerformClick.run(View.java:18433 )
at android.os.Handler.handleCallback(Handler.java:733 )
at android.os.Handler.dispatchMessage(Handler.java:95 )
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.jav a:5021)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:827)
at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:643)
at dalvik.system.NativeStart.main(Native Method)
01-04 07:07:32.564 5501-5501/? E/gpop.InstalledAppsGrid﹕ Hidden list size 0
01-04 07:07:32.584 5491-5491/? E/GuidanceScreen﹕ Initiating download of new key mapping for package: com.bluestacks.gamepophome
01-04 07:07:32.614 5501-5501/? E/gpop.WebChannelsAppsGrid﹕ Reached fillchannelrow of WebChannelAppsGrid
01-04 07:07:32.634 5501-5501/? E/gpop.WebChannelsAppsGrid﹕ Reached fillchannelrow of WebChannelAppsGrid
01-04 07:07:32.634 5501-5501/? E/gpop.WebChannelsAppsGrid﹕ Reached fillchannelrow of WebChannelAppsGrid
01-04 07:07:32.644 5501-5501/? E/gpop.WebChannelsAppsGrid﹕ Reached fillchannelrow of WebChannelAppsGrid
01-04 07:07:32.654 5501-5501/? E/gpop.WebChannelsAppsGrid﹕ Reached fillchannelrow of WebChannelAppsGrid
01-04 07:07:32.664 5501-5501/? E/gpop.WebChannelsAppsGrid﹕ Reached fillchannelrow of WebChannelAppsGrid
01-04 07:07:32.664 5501-5501/? E/gpop.WebChannelsAppsGrid﹕ Reached fillchannelrow of WebChannelAppsGrid
01-04 07:07:32.674 5501-5501/? E/gpop.WebChannelsAppsGrid﹕ Reached fillchannelrow of WebChannelAppsGrid
01-04 07:07:32.684 5501-5501/? E/gpop.WebChannelsAppsGrid﹕ Reached fillchannelrow of WebChannelAppsGrid
01-04 07:07:32.684 5501-5501/? E/gpop.WebChannelsAppsGrid﹕ Reached fillchannelrow of WebChannelAppsGrid
01-04 07:07:32.694 5501-5501/? E/gpop.WebChannelsAppsGrid﹕ Reached fillchannelrow of WebChannelAppsGrid
01-04 07:07:32.704 5501-5501/? E/gpop.WebChannelsAppsGrid﹕ Reached fillchannelrow of WebChannelAppsGrid
01-04 07:07:32.714 5501-5501/? E/gpop.WebChannelsAppsGrid﹕ Reached fillchannelrow of WebChannelAppsGrid
01-04 07:07:32.714 5501-5501/? E/gpop.WebChannelsAppsGrid﹕ Reached fillchannelrow of WebChannelAppsGrid
01-04 07:07:33.664 5501-6239/? E/KeyMappingDownloader﹕ Failed to fetch map from web: http://opasanet.appspot.com/op/appmap?id=com.bluestacks.gamepophome
java.io.FileNotFoundException: http://opasanet.appspot.com/op/appmap?id=com.bluestacks.gamepophome
at com.android.okhttp.internal.http.HttpURLConnection Impl.getInputStream(HttpURLConnectionImpl.java:186 )
at com.bluestacks.api.util.getResponse(util.java:97)
at tv.gamepop.home.KeyMappingDownloader.fetchMappingF romWeb(KeyMappingDownloader.java:116)
at tv.gamepop.home.KeyMappingDownloader.downloadMappi ngsForPackage(KeyMappingDownloader.java:99)
at tv.gamepop.home.KeyMappingDownloader.onHandleInten t(KeyMappingDownloader.java:56)
at android.app.IntentService$ServiceHandler.handleMes sage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:10 2)
at android.os.Looper.loop(Looper.java:136)
at android.os.HandlerThread.run(HandlerThread.java:61 )
01-04 07:09:06.224 5906-5929/? E/Blue.Utils.getApk﹕ Request responsecode: 403

Ruhallah.Ahmadian
دوشنبه 14 دی 1394, 19:55 عصر
فکر میکنم باید تابع open رو فراخوانی کنید
بعد namayesh

CRbreeze
دوشنبه 14 دی 1394, 20:14 عصر
خب تو کد هم همین اتفاق داری میفته دیگه

CRbreeze
دوشنبه 14 دی 1394, 20:15 عصر
فقط یه سوال الان واسه خودم پیش اومد تو تابع copydatabase() من دارم یه کپی میگیرم ازش تو mydb موقع open کردن باید کدوم رو باز کنم؟ mydb رو دیگه درسته؟ اما چجوری؟

gjmkdyttyhujk
دوشنبه 14 دی 1394, 20:24 عصر
نمی تونه دیتابیس رو باز کنه. احتمالا مسیرتون اشتباه هست. این موارد رو چک کنید ببینید درست میشه. یه پسوندی هم برای دیتابیستون تعیین کنید.

CRbreeze
دوشنبه 14 دی 1394, 20:43 عصر
نمی تونه دیتابیس رو باز کنه. احتمالا مسیرتون اشتباه هست. این موارد رو چک کنید ببینید درست میشه. یه پسوندی هم برای دیتابیستون تعیین کنید.

ببخشید میشه بگید الان باید چه مسیری بدم؟ فایل دیتابیسم تو پوشه assets هست

CRbreeze
دوشنبه 14 دی 1394, 23:14 عصر
نمی تونه دیتابیس رو باز کنه. احتمالا مسیرتون اشتباه هست. این موارد رو چک کنید ببینید درست میشه. یه پسوندی هم برای دیتابیستون تعیین کنید.

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

gjmkdyttyhujk
دوشنبه 14 دی 1394, 23:29 عصر
من مسیر رو هم عوض کردم اما باز هم برامه بسته میشه...شما نمیدونید که از طریق دیگه ای هم میشه از پایگاه داده خارجی چیزی خوند یانه؟

دو سه جا رو احتمال میدم اشتباه نوشته باشید. ببینید منطق کار با دیتابیس خارجی به این صورت هست که شما ابتدا فایل دیتابیستون رو در پوشه asset تون قرار میدید. بعد داخل این کلاستون میایید اول از همه بررسی می کنید تا ببینید آیا داخل پوشه برنامه تون هست یا نه. اگه بود که میرید مواردی که نیاز دارید رو ازش می خونید ولی اگه نبود یک کپی از دیتابیسی که در پوشه asset هست برمیدارید و در پوشه برنامه قرار میدید و کارتون رو ادامه میدید. زمانی که می خواهید از دیتابیستون مواردی رو بخونید میایید اول اون رو باز میکنید. برای باز کردن هم باید مسیر درست اون که در پوشه برنامه هست رو بدید وگرنه با خطا روبرو میشید و اگه خطا رو هم مدیریت نکنید برنامه force close میشه. باید کدهای شما از این منطق پیروی کنه وگرنه با خطا یا مشکلات دیگه ای روبرو میشید. موفق باشید.

CRbreeze
دوشنبه 14 دی 1394, 23:39 عصر
دو سه جا رو احتمال میدم اشتباه نوشته باشید. ببینید منطق کار با دیتابیس خارجی به این صورت هست که شما ابتدا فایل دیتابیستون رو در پوشه asset تون قرار میدید. بعد داخل این کلاستون میایید اول از همه بررسی می کنید تا ببینید آیا داخل پوشه برنامه تون هست یا نه. اگه بود که میرید مواردی که نیاز دارید رو ازش می خونید ولی اگه نبود یک کپی از دیتابیسی که در پوشه asset هست برمیدارید و در پوشه برنامه قرار میدید و کارتون رو ادامه میدید. زمانی که می خواهید از دیتابیستون مواردی رو بخونید میایید اول اون رو باز میکنید. برای باز کردن هم باید مسیر درست اون که در پوشه برنامه هست رو بدید وگرنه با خطا روبرو میشید و اگه خطا رو هم مدیریت نکنید برنامه force close میشه. باید کدهای شما از این منطق پیروی کنه وگرنه با خطا یا مشکلات دیگه ای روبرو میشید. موفق باشید.

سپاس گزارم از راهنماییتون :لبخندساده:

#root#
دوشنبه 14 دی 1394, 23:53 عصر
جدا از اینکه شما باید قدم به قدم جلو برید ولی نمیرید، مثلا یادگیری debug کردن برنامه مقدم تر از بحث دیتابیس هست،
مسیری که برای دیتابیس نوشته شده درست نیست:

public final String path="data/data/com.example.pc1.book/data";


data صحیح نیست، databases باید باشه.

من مسیر دیتابیس رو با این روش میگیرم :)

138194

CRbreeze
سه شنبه 15 دی 1394, 00:07 صبح
جدا از اینکه شما باید قدم به قدم جلو برید ولی نمیرید، مثلا یادگیری debug کردن برنامه مقدم تر از بحث دیتابیس هست،
مسیری که برای دیتابیس نوشته شده درست نیست:

public final String path="data/data/com.example.pc1.book/data";


data صحیح نیست، databases باید باشه.

من مسیر دیتابیس رو با این روش میگیرم :)

138194


بله حق با شماست

ولی من اون path رو به کد زیر هم که تغییر دادم درست نشد

path=context.getDatabasePath(Name).getPath();

CRbreeze
سه شنبه 15 دی 1394, 00:33 صبح
با تشکر از دوستان
#root# (http://barnamenevis.org/member.php?320639-root)
و ​
gjmkdyttyhujk (http://barnamenevis.org/member.php?189462-gjmkdyttyhujk) مشکل برنامه من حل شد :لبخندساده: