PDA

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



slr560
پنج شنبه 26 تیر 1393, 13:07 عصر
سلام دوستان
از دیروز دارم روی یه مشکل کار میکنم که واقعا داغونم کرده
داغ کردم دیگه :گریه:

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

خب حالا میخوام به محض اینکه روی دکمه باتن ورود کلیک شد مقدارهای ۲تا تکست باکس رو بگیره و یه query بزنه به دیتابیس و بگه آیا این یوزر پسورد وجود داره یا نه. که اگه وجود داشت وارد برنامه بشه

کد زیر توی کلاس DBAdapter من هست

public Cursor getLoginContact(int stuNumber, int stuPassword) { Cursor cursor = db.rawQuery(
"SELECT " + KEY_STU_NUMBER + "," + KEY_STU_PASSWORD + " FROM " + DATABASE_TABLE
+ " WHERE " + KEY_STU_NUMBER + "=" + stuNumber + " and " + KEY_STU_PASSWORD
+ "=" + stuPassword, new String[]{KEY_STU_NUMBER, KEY_STU_PASSWORD});
return cursor;
}

این تا اینجا میاد یه Query میزنه به دیتا بیس و یه Cursor برمیگردونه.

حالا میام داخل کلاس لوگینم این کد رو مینویسم

Cursor cursor = db .getLoginContact((int) Double.parseDouble(username.getText().toString()),
(int) Double.parseDouble(password.getText().toString())) ;
if (cursor != null) {
Log.d("database", "انجام شد");
} else {
Log.d("database", "انجام نشد");
}

اینم بگم که مقدارهای یوزر و پسورد رو از نوع INT گرفتم توی دیتابیس و اینجا هم به ورودی INT
مشکل اینجاس به محض اینکه کلیک میکنم forc close میده

smemamian
پنج شنبه 26 تیر 1393, 13:26 عصر
سلام
Log رو بذارید.

این رو تست کنید:
new String[]{String.valueOf(KEY_STU_NUMBER), String.valueOf(KEY_STU_PASSWORD)}

slr560
پنج شنبه 26 تیر 1393, 13:35 عصر
اینم Logcat

من فکر میکنم از کلاس متد getLoginContact باشه. درسته؟


07-17 14:07:27.651 11555-11555/ir.darabifard.daneshjo D/AndroidRuntime﹕ Shutting down VM07-17 14:07:27.651 11555-11555/ir.darabifard.daneshjo W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x4154cba8)
07-17 14:07:27.701 11555-11555/ir.darabifard.daneshjo D/dalvikvm﹕ GC_FOR_ALLOC freed 476K, 13% free 5035K/5788K, paused 25ms, total 25ms
07-17 14:07:27.711 11555-11555/ir.darabifard.daneshjo E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: ir.darabifard.daneshjo, PID: 11555
java.lang.NullPointerException
at ir.darabifard.daneshjo.database.DBAdapter.getLogin Contact(DBAdapter.java:124)
at ir.darabifard.daneshjo.LoginActivity.onClick(Login Activity.java:93)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18439 )
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:5053)
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:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:601)
at dalvik.system.NativeStart.main(Native Method)

smemamian
پنج شنبه 26 تیر 1393, 13:38 عصر
خط 124 کلاس DBAdapter شما چیه ؟

slr560
پنج شنبه 26 تیر 1393, 13:40 عصر
خط 124 کلاس DBAdapter شما چیه ؟

همین متد getLoginContact هست

شکل دستور دادن من اشتباهه؟

خط ۹۳ هم دقیقا همون کدی هست که توی پست اول نوشتم . دومیش

smemamian
پنج شنبه 26 تیر 1393, 13:58 عصر
من توی notepad نوشتم، بررسی کن :

public Cursor getLoginContact(int stuNumber, int stuPassword) { Cursor cursor = db.rawQuery(
"SELECT " + KEY_STU_NUMBER + "," + KEY_STU_PASSWORD + " FROM " + DATABASE_TABLE
+ " WHERE " + KEY_STU_NUMBER + "=? + and " + KEY_STU_PASSWORD + "=?", new String[]{String.valueOf(KEY_STU_NUMBER), String.valueOf(KEY_STU_PASSWORD)});
return cursor;
}

slr560
پنج شنبه 26 تیر 1393, 14:11 عصر
من توی notepad نوشتم، بررسی کن :

public Cursor getLoginContact(int stuNumber, int stuPassword) { Cursor cursor = db.rawQuery(
"SELECT " + KEY_STU_NUMBER + "," + KEY_STU_PASSWORD + " FROM " + DATABASE_TABLE
+ " WHERE " + KEY_STU_NUMBER + "=? + and " + KEY_STU_PASSWORD + "=?", new String[]{String.valueOf(KEY_STU_NUMBER), String.valueOf(KEY_STU_PASSWORD)});
return cursor;
}


متد شما رو نوشتم به شکل زیر:

public Cursor getLoginContact(int stuNumber, int stuPassword) { Cursor cursor = db.rawQuery(
"SELECT " + KEY_STU_NUMBER + "," + KEY_STU_PASSWORD + " FROM " + DATABASE_TABLE
+ " WHERE " + KEY_STU_NUMBER + "=?" +" and " + KEY_STU_PASSWORD + "=?",
new String[]{String.valueOf(KEY_STU_NUMBER), String.valueOf(KEY_STU_PASSWORD)}
);
return cursor;
}


حالا توی Log ارور این خط رفت دیگه
حالا به خط ۹۳ قبلی گیر داده.
نوشته invalid double

07-17 14:40:56.395 17981-17981/ir.darabifard.daneshjo D/AndroidRuntime﹕ Shutting down VM07-17 14:40:56.395 17981-17981/ir.darabifard.daneshjo W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x4154cba8)
07-17 14:40:56.395 17981-17981/ir.darabifard.daneshjo E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: ir.darabifard.daneshjo, PID: 17981
java.lang.NumberFormatException: Invalid double: ""
at java.lang.StringToReal.invalidReal(StringToReal.ja va:63)
at java.lang.StringToReal.parseDouble(StringToReal.ja va:248)
at java.lang.Double.parseDouble(Double.java:295)
at ir.darabifard.daneshjo.LoginActivity.onClick(Login Activity.java:93)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18439 )
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:5053)
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:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:601)
at dalvik.system.NativeStart.main(Native Method)




قبلا از int توی یه جای برنامه استفاده کردم . ولی وقتی بیشتر از ۹ رقم وارد میکردم ارور میداد. حالا اینجا هم اومدم از دابل استفاده کردم
نوع ورودی رو چی بزارم؟

smemamian
پنج شنبه 26 تیر 1393, 14:23 عصر
از String استفاده کن .

slr560
پنج شنبه 26 تیر 1393, 20:43 عصر
آقا یکی بیاد بگه اشکال کار من چیه؟
دیگه داغ کردم.

این متد اصلیم هست که بهم گیر میده
به خط ۶ گیر میده

public Cursor getLoginContact(String stuNumber, String stuPassword) {

String query = "select " + KEY_STU_NUMBER + "," + KEY_STU_PASSWORD + " from "
+ DATABASE_TABLE + " WHERE " + KEY_STU_NUMBER + "=" + stuNumber + " AND "
+ KEY_STU_PASSWORD + "=" + stuPassword;
Cursor cursor = db.rawQuery(query,new String[]{stuNumber,stuPassword});
if (cursor != null) {
cursor.moveToFirst();
}
return cursor;
}

poorman
پنج شنبه 26 تیر 1393, 22:37 عصر
سلام

این تابع رو اینطوری درستش کنین

public Cursor getLoginContact(String stuNumber, String stuPassword) {
Cursor cursor = db.rawQuery("select " + KEY_STU_NUMBER + "," + KEY_STU_PASSWORD + " from "
+ DATABASE_TABLE + " WHERE " + KEY_STU_NUMBER + " = '" + stuNumber + "' AND "
+ KEY_STU_PASSWORD + " = '" + stuPassword + "'",null);
if (cursor != null) {
cursor.moveToFirst();
}
return cursor;
}

در کل هم وقتی شما دارید یوزر و پسوورد رو ذخیره میکنید مسلما توی دیتابیس نوع داده رو TEXT بذارید و به صورت getString از Cursor دریافت کنید

slr560
پنج شنبه 26 تیر 1393, 22:59 عصر
سلام

این تابع رو اینطوری درستش کنین

public Cursor getLoginContact(String stuNumber, String stuPassword) {
Cursor cursor = db.rawQuery("select " + KEY_STU_NUMBER + "," + KEY_STU_PASSWORD + " from "
+ DATABASE_TABLE + " WHERE " + KEY_STU_NUMBER + " = '" + stuNumber + "' AND "
+ KEY_STU_PASSWORD + " = '" + stuPassword + "'",null);
if (cursor != null) {
cursor.moveToFirst();
}
return cursor;
}

در کل هم وقتی شما دارید یوزر و پسوورد رو ذخیره میکنید مسلما توی دیتابیس نوع داده رو TEXT بذارید و به صورت getString از Cursor دریافت کنید


مرسی فکر کنم درست شد
بیشتر داده های NUMERIC رو به صورت TEXT تغییر دادم تو دیتابیس
اگه TEXT بزارم مشکلی پیش نمیاد؟

حالا چطوری میتونم از Cursor مقدارهاشو بگیرم؟ توی یه کلاس دیگه

poorman
پنج شنبه 26 تیر 1393, 23:06 عصر
حالا چطوری میتونم از Cursor مقدارهاشو بگیرم؟ توی یه کلاس دیگه

به سختی :|

کاری نداره دیگه

به این تاپیک مراجعه کنین، پست اول، قسمت خوندن اطلاعات از دیتابیس

http://barnamenevis.org/showthread.php?441406-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-SQLite-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-%D8%A8%D8%AF%D9%88%D9%86-%D9%86%DB%8C%D8%A7%D8%B2-%D8%A8%D9%87-%DA%A9%D9%84%D8%A7%D8%B3-DataBaseHelper

slr560
پنج شنبه 26 تیر 1393, 23:20 عصر
به سختی :|

کاری نداره دیگه

به این تاپیک مراجعه کنین، پست اول، قسمت خوندن اطلاعات از دیتابیس

http://barnamenevis.org/showthread.php?441406-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-SQLite-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-%D8%A8%D8%AF%D9%88%D9%86-%D9%86%DB%8C%D8%A7%D8%B2-%D8%A8%D9%87-%DA%A9%D9%84%D8%A7%D8%B3-DataBaseHelper

مرسی داداشم.

اگه طرف یوزر پس رو درست بزنه وارد میشه و Cursor برگشت داده میشه
حالا اگه درست وارد نکرد و به قول معروف تو متد بالا مساوی نبود برنامه کرش میکنه؟
چیکار کنم که کرش نکنه و هندلش کنم؟ اگه مساوی نبود چی برگشت داده میشه؟

poorman
پنج شنبه 26 تیر 1393, 23:23 عصر
public boolean getLoginContact(String stuNumber, String stuPassword) {
Cursor cursor = db.rawQuery("select " + KEY_STU_NUMBER + "," + KEY_STU_PASSWORD + " from "
+ DATABASE_TABLE + " WHERE " + KEY_STU_NUMBER + " = '" + stuNumber + "' AND "
+ KEY_STU_PASSWORD + " = '" + stuPassword + "'",null);
if (cursor.moveToFirst()) {
return true;
}
return false;
}

اینطوری دیگه کرش نمیکنه

اگر جواب برگشتی true بود یعنی درست زده، اگر false بود یعنی اشتباه

slr560
یک شنبه 29 تیر 1393, 12:30 عصر
یه سوال دیگه
واسه دستور select ی که ۲تا آرگومان واسه شرطش داره
مثلا همین بالا. stu_number و stu_password
باید این ۲تا کلید باشن حتما؟ stu_number که کلید اصلی هست
اون یکی رو نمیدونم باید کلید باشه یا نه؟؟؟؟
کلید اصلی که نمیتونه ۲تا باشه. باید foren key بشه stu_number؟ توی create table چجوری مقدارشو foren key بکم؟

poorman
یک شنبه 29 تیر 1393, 12:34 عصر
کلید اصلی رو فقط نام کاربری بذارید چون پسوورد میتونه هر چیزی باشه اما نام کاربری نباید تکرار بشه