PDA

View Full Version : مشکل دیتابیس در اندروید استودیو



o0o0okay
جمعه 25 مهر 1393, 17:43 عصر
سلام
من توی تعریف و اتصال دیتابیس (SQLite) در محیط برنامه نویسی Android Studio به مشکل برخوردم.
یه اموزش ویدیویی، ساخت کتاب اندروید هست، که من با اون داشتم جلو میرفتم اما همون اول کاری به مشگل برخوردم.
(اموزشهای ویدیویی بر اساس محیط اکلیپس هست، من دارم با اندروید استدیو کد مینویسم)
وقتی برنامه رو توی جیمولیش بالا میارم، روی Button کلیک میکنم، کرش میکنه میاد بیرون.


ما یه دیتابیس درست میکنیم که دارای 6تا فیلد
جدول = database
تیبل = contents

ID = INTEGER
name = TEXT
page = INTEGER
text = TEXT
season = TEXT
star = INTEGER


DatabasesActivity.java

public class MainActivity extends Activity {


private database db;


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


db = new database(this);
db.useable();
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {


@Override
public void onClick(View arg0) {
db.open();
String str = db.namayesh(0, 1, "contents");
Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
db.close();
}
});


}








@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}





DBAdapter.java

public class database extends SQLiteOpenHelper {


public final String path = "data/data/com.saeed.ebook/database/";
public final String Name = "database";
public SQLiteDatabase mydb;
private final Context mycontext;




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




@Override
public void onCreate(SQLiteDatabase arg0) {


}




@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {


}




public void useable() {
boolean checkdb = checkdb();
if (checkdb) {


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


}
}
}




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




@Override
public void close() {
mydb.close();
}




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


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




public void copydatabase() throws IOException {


OutputStream myOutput = new FileOutputStream(path + Name);
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){


android.database.Cursor Cursor = mydb.rawQuery("SELECT * FROM "+table , null);
Cursor.moveToPosition(row);
String str = Cursor.getString(field);
return str;
}


}



activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity" >


<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn"
android:id="@+id/btn"
android:layout_marginTop="67dp"
android:layout_gravity="center_horizontal" />
</LinearLayout>




من یبار پوشه assets رو زیر مجموعه main گذاشتم، کرش کرد، یبارم زیر مجوعه app گذاشتم که بازم کرش کرد.
اگه اطلاعات کمه بگید بزارم.
ممنون میشم اگه زود جواب بدید :قلب:

abbasalim
پنج شنبه 08 آبان 1393, 10:09 صبح
سلام لاگ بزارید فکر کنم بهتر باشه

gilas1368
پنج شنبه 08 آبان 1393, 10:27 صبح
دوست عزیز شما نباید ی پوشه ب اسم assets بسازید ک
خوده اندروید استودیو پوشه assets رو داره شما باید دیتابیستون رو داخل اون پوشه بزارید
خوش متوجه میشه و میره کپیش میکنه ب اون ادرسی ک شما میخاید
داخل روت پروژه اتون کلمه assets رو جستجو کنین میارش

اگ نسخه اندروید استودیوتون جدید باشه توی این آدرس میتونید پوشه assets رو پیدا کنین:


<root project>/app/intermeaite/assets/debug

فک کنم ادرسو درست نوشتم اما بابت غلط املایی شرمنده

abbasalim
پنج شنبه 08 آبان 1393, 10:41 صبح
دوست عزیز شما نباید ی پوشه ب اسم assets بسازید ک
خوده اندروید استودیو پوشه assets رو داره شما باید دیتابیستون رو داخل اون پوشه بزارید
خوش متوجه میشه و میره کپیش میکنه ب اون ادرسی ک شما میخاید
داخل روت پروژه اتون کلمه assets رو جستجو کنین میارش

اگ نسخه اندروید استودیوتون جدید باشه توی این آدرس میتونید پوشه assets رو پیدا کنین:


<root project>/app/intermeaite/assets/debug

فک کنم ادرسو درست نوشتم اما بابت غلط املایی شرمنده

ولی اینکه واسه نسخه دیباگ هست (فکر میکنم) باید پوشه رو بسازید داخل پوشه main (من که اینکار میکنم کار میکنه)

gilas1368
پنج شنبه 08 آبان 1393, 11:04 صبح
ولی اینکه واسه نسخه دیباگ هست (فکر میکنم) باید پوشه رو بسازید داخل پوشه main (من که اینکار میکنم کار میکنه)

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

o0o0okay
دوشنبه 12 آبان 1393, 21:20 عصر
سلام لاگ بزارید فکر کنم بهتر باشه
سلام و درود
متاسفانه طبق مسیر دهی Database که دوستمون گفت رفتم، نمیدونم چرا اندروید استودیوم کلا قاطی کرده، دیگه هیچ برنامه ی رو بالا نمیاره.
پاک کردم، sdk هام هم پاک شد.
بعد نصب حتما لاگ شو میزارم، تشکر

o0o0okay
دوشنبه 12 آبان 1393, 21:32 عصر
دوست عزیز شما نباید ی پوشه ب اسم assets بسازید ک
خوده اندروید استودیو پوشه assets رو داره شما باید دیتابیستون رو داخل اون پوشه بزارید
خوش متوجه میشه و میره کپیش میکنه ب اون ادرسی ک شما میخاید
داخل روت پروژه اتون کلمه assets رو جستجو کنین میارش

اگ نسخه اندروید استودیوتون جدید باشه توی این آدرس میتونید پوشه assets رو پیدا کنین:


<root project>/app/intermeaite/assets/debug

فک کنم ادرسو درست نوشتم اما بابت غلط املایی شرمنده

سلام
اقا ببخشید دو مسیر

app => build => intermediates => exploded-aar => com.android.support => appcompat-v7 => 20.0.0 => assets
یا



app => build => intermediates => exploded-aar => com.android.support => support-v4 => 20.0.0 => assets
.
.
.
متاسفانه بعد از اینکه database رو در مسیر زیر کپی کردم

app => build => intermediates => exploded-aar => com.android.support => appcompat-v7 => 20.0.0 => assets
روی app همون Select Run/Debug Configuration علامت ضربدر خورده، هر چی هم تنظیمات Run_Edit Configurations رو هرچی چک میکنم، هیچ تغییر خاصی هم میبینم! :متفکر:
فکر کنم پاکش کنم بهتر باشه، از نو نصبش کنم.
تشکر

abbasalim
دوشنبه 12 آبان 1393, 22:59 عصر
هر دوتا آدرسی که دادین مربوط به کتابخونه ها هستن و ربطی به دیتابیس برنامتون نداره

o0o0okay
سه شنبه 13 آبان 1393, 09:41 صبح
هر دوتا آدرسی که دادین مربوط به کتابخونه ها هستن و ربطی به دیتابیس برنامتون نداره

من مسیر رو میرم
app => build => intermediates ولی پوشه assets وجو نداره. ورژن اندروید استودیوم هم Androdi Studio_Beta_0.8.6 هست.
گفتید مسیرشو تغییر بدید، منم تا اون حدودی که گفتید رفتم، اما فقط 2تا پوشه assets بود، که توی اونا قرار دادم.
خب من الان دقیقا دیتابیس رو کجا کپی کنم.
مسیرشو دقیق میشه بگید؟
ممنون
root\app\build\intermediates\assets\debug\database .db
منظورتون اگه مسیر بالا هست. دستی این کارو هم کردم. اما متاسفانه فایده ی نداشتش. :ناراحت:

o0o0okay
سه شنبه 13 آبان 1393, 11:31 صبح
سلام لاگ بزارید فکر کنم بهتر باشه
بلاخره نصب کردم

بفرمایید اساتید اینم logcat


11-04 08:33:24.863 1821-1821/com.cumputer.ebook D/dalvikvm﹕ GC_FOR_ALLOC freed 146K, 14% free 2881K/3332K, paused 2ms, total 2ms
11-04 08:33:24.867 1821-1821/com.cumputer.ebook E/SQLiteLog﹕ (14) cannot open file at line 30191 of [00bb9c9ce4]
11-04 08:33:24.867 1821-1821/com.cumputer.ebook E/SQLiteLog﹕ (14) os_unix.c:30191: (2) open(//data/data/com.cumputer.ebook/databases/database) -
11-04 08:33:24.867 1821-1821/com.cumputer.ebook E/SQLiteDatabase﹕ Failed to open database 'data/data/com.cumputer.ebook/databases/database'.
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.cumputer.ebook.database.checkdb(database.java: 66)
at com.cumputer.ebook.database.useable(database.java: 38)
at com.cumputer.ebook.MainActivity.onCreate(MainActiv ity.java:21)
at android.app.Activity.performCreate(Activity.java:5 133)
at android.app.Instrumentation.callActivityOnCreate(I nstrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:2175)
at android.app.ActivityThread.handleLaunchActivity(Ac tivityThread.java:2261)
at android.app.ActivityThread.access$600(ActivityThre ad.java:141)
at android.app.ActivityThread$H.handleMessage(Activit yThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:99 )
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.jav a:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:553)
at dalvik.system.NativeStart.main(Native Method)
11-04 08:33:25.015 1821-1821/com.cumputer.ebook D/libEGL﹕ loaded /system/lib/egl/libEGL_genymotion.so
11-04 08:33:25.015 1821-1821/com.cumputer.ebook D/﹕ HostConnection::get() New Host Connection established 0xb8e773a0, tid 1821
11-04 08:33:25.019 1821-1821/com.cumputer.ebook D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_genymotion.so
11-04 08:33:25.019 1821-1821/com.cumputer.ebook D/libEGL﹕ loaded /system/lib/egl/libGLESv2_genymotion.so
11-04 08:33:25.067 1821-1821/com.cumputer.ebook W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
11-04 08:33:25.067 1821-1821/com.cumputer.ebook E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from GradienCache
11-04 08:33:25.071 1821-1821/com.cumputer.ebook E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from Caches::initConstraints()
11-04 08:33:25.071 1821-1821/com.cumputer.ebook D/OpenGLRenderer﹕ Enabling debug mode 0

بعد کلیک روی باتن هم


11-04 08:34:11.719 1821-1821/com.cumputer.ebook E/SQLiteLog﹕ (1) no such table: contents
11-04 08:34:11.719 1821-1821/com.cumputer.ebook D/AndroidRuntime﹕ Shutting down VM
11-04 08:34:11.719 1821-1821/com.cumputer.ebook W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xa4bc0648)
11-04 08:34:11.719 1821-1821/com.cumputer.ebook E/AndroidRuntime﹕ FATAL EXCEPTION: main
android.database.sqlite.SQLiteException: no such table: contents (code 1): , while compiling: SELECT * FROM contents
at android.database.sqlite.SQLiteConnection.nativePre pareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePr eparedStatement(SQLiteConnection.java:889)
at android.database.sqlite.SQLiteConnection.prepare(S QLiteConnection.java:500)
at android.database.sqlite.SQLiteSession.prepare(SQLi teSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.q uery(SQLiteDirectCursorDriver.java:44)
at android.database.sqlite.SQLiteDatabase.rawQueryWit hFactory(SQLiteDatabase.java:1314)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQ LiteDatabase.java:1253)
at com.cumputer.ebook.database.namayesh(database.java :90)
at com.cumputer.ebook.MainActivity$1.onClick(MainActi vity.java:28)
at android.view.View.performClick(View.java:4240)
at android.view.View$PerformClick.run(View.java:17721 )
at android.os.Handler.handleCallback(Handler.java:730 )
at android.os.Handler.dispatchMessage(Handler.java:92 )
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.jav a:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:553)
at dalvik.system.NativeStart.main(Native Method)


نمیدونم چرا حس فک کردن ندارم :ناراحت:
اگه خواستین کاره اخرو میکنم. پروژه رو آپ میکنم. نگاش کننین.
ولی فک کنم همین logcat براتون مشخص کنه اشتباهاتم کجاست.
بابت وقتی که میگذارید ممنونم :قلب: