সারিগুলি গণনা করতে অ্যান্ড্রয়েডে এসকিউএলাইট ক্যোয়ারী


92

আমি একটি সাধারণ লগইন ফর্ম তৈরি করার চেষ্টা করছি, যেখানে আমি লগইন স্ক্রিনে প্রবেশ করা লগইন আইডি এবং পাসওয়ার্ডটি ডাটাবেসে সঞ্চিত সাথে তুলনা করছি।

আমি নিম্নলিখিত কোয়েরি ব্যবহার করছি:

final String DATABASE_COMPARE =
"select count(*) from users where uname=" + loginname + "and pwd=" + loginpass + ");" ;

বিষয়টি হ'ল, আমি জানি না, আমি কীভাবে উপরের ক্যোয়ারীটি কার্যকর করতে পারি এবং ফেরত গণনাটি সঞ্চয় করতে পারি।

এখানে ডাটাবেস টেবিলটি কেমন দেখাচ্ছে (আমি এক্সিকিউএসএলএল পদ্ধতিটি সফলভাবে ডেটাবেস তৈরি করতে প্রস্তুত করেছি)

private static final String
DATABASE_CREATE =
            "create table users (_id integer autoincrement, "
            + "name text not null, uname primary key text not null, " 
            + "pwd text not null);";//+"phoneno text not null);";

আমি কীভাবে এটি অর্জন করতে পারি তার জন্য কেউ দয়া করে আমাকে গাইড করতে পারেন? যদি সম্ভব হয় তবে উপরের কাজটি করার জন্য একটি নমুনা স্নিপেট সরবরাহ করুন।

উত্তর:


122

ডেটাবেস ইউটেলস.কিউরিউনমেন্টস (যেহেতু এপিআই: 11) কার্যকর বিকল্প যা কাঁচা এসকিউএল (ইয়ে!) এর প্রয়োজনীয়তা উপেক্ষা করে।

SQLiteDatabase db = getReadableDatabase();
DatabaseUtils.queryNumEntries(db, "users",
                "uname=? AND pwd=?", new String[] {loginname,loginpass});

ওএস <11 এর জন্য, এটি NoSuchMethodError ত্রুটি পায়, ওএস <11 11 সমর্থন করার জন্য কি কোনও কাজের আশপাশ রয়েছে?
খোবাইব

4
@ খোবায়েব ঘোচিনয় থেকে উত্তরটি দেখুন
এডুয়ার্ডো

4
@ এদুয়ার্ডো হার্জার আমি সরাসরি কার্সার.জেটকাউন্ট () দিয়ে একটি উপায় খুঁজে পেয়েছি।
খোবাইব

4
@ খোবাইব এটি করার খুব দক্ষ উপায় নয়। আপনার সবসময় সমস্ত রেকর্ড পুনরুদ্ধার করতে SELECT COUNT(*)এবং queryNumEntries()তার চেয়ে বেশি পছন্দ করা উচিত , অর্থাত্ কয়টি রয়েছে seeing cursor.getCount()
প্রিয়ভোল্ট

115

@ স্কটটিব প্যারামেট্রাইজড ডেটাবেস ইউটিস.কিউরিউনমেন্টস (ডিবি, টেবিল, হোয়ারপ্যারামস) এপিআই 11 + এ উপস্থিত রয়েছে , এপ্রিআরএমবিহীন একটি এপিআই 1 এর পর থেকেই বিদ্যমান । উত্তরটি db.rawQuery সহ একটি কার্সার তৈরি করতে হবে:

Cursor mCount= db.rawQuery("select count(*) from users where uname='" + loginname + "' and pwd='" + loginpass +"'", null);
mCount.moveToFirst();
int count= mCount.getInt(0);
mCount.close();

আমি প্যারামিটারাইজড ক্যোয়ারী সহ @ ড্রির উত্তরও পছন্দ করি।


4
ঐ হতাশ জন্য, -এর প্যারামিটার mCount.getInt()হয় columnindex। সাহায্যের জন্য ধন্যবাদ!
ডুডি

62

একটি এসকিউএলসাইট ব্যবহার করুন ।

যেমন

 SQLiteStatement s = mDb.compileStatement( "select count(*) from users where uname='" + loginname + "' and pwd='" + loginpass + "'; " );

  long count = s.simpleQueryForLong();

4
@ স্কটিয়াবের জবাব (যা সত্যিই ভাল) এর উত্তর সম্পর্কে আমি একটি জিনিস পছন্দ করি তা হ'ল আপনি এই ক্ষেত্রে একটি সীমাবদ্ধ বিধি নির্দিষ্ট করতে পারেন। এটি কার্যকর যখন আপনি কেবল জানতে চান যে কোনও সারণিতে কোনও সারি রয়েছে কিনা (উদাহরণস্বরূপ, সারণী সীমাবদ্ধতা 1 থেকে বনাম কোনও সারি নির্বাচন করুন (গণনা (*)> 0) নির্বাচন করুন। আমি অনুমান করছি যে যখন টেবিলে কোনও সারি বা এক টন সারি না থাকতে পারে তখন দ্রুত হবে। এটি সন্ধান করার সময় আমার এই নির্দিষ্ট
কেসটি

@ টেকনোগ্রেবো: এটি একটি দুর্দান্ত উত্তর, যদিও আমি প্যারামিটারাইজড সংস্করণটি ব্যবহার করব। আপনি কোয়েরিতে ?এস ব্যবহার করতে পারেন এবং তারপরে মানগুলি সন্নিবেশ করতে bindString(int, String)এবং ব্যবহার bindLong(int, long)করতে পারেন । এখানে দেখুন ।
প্রিয়ভোল্ট

23

দেখুন rawQuery (STRING, STRING []) এবং জন্য ডকুমেন্টেশন কার্সার

তোমার DADABASE_COMPARE SQL বক্তব্য বর্তমানে অবৈধ, loginnameএবং loginpassপলান করা হবে না, সেখানে মধ্যে কোনো স্থান loginnameএবং and, এবং আপনার সাথে বিবৃতি শেষ); পরিবর্তে ; - আপনি যদি পাসওয়ার্ডের পাসওয়ার্ড দিয়ে বব হিসাবে লগ ইন করছিলেন তবে সেই বিবৃতিটি শেষ হয়ে যাবে

select count(*) from users where uname=boband pwd=password);

এছাড়াও, আপনি সম্ভবত নির্বাচনআরগ বৈশিষ্ট্যটি ব্যবহার করে লগইননাম এবং লগইনপাসকে সম্মতি না দিয়ে ব্যবহার করতে পারেন।

সিলেকশনআর্গগুলি ব্যবহার করতে আপনি এমন কিছু করতে পারেন

final String SQL_STATEMENT = "SELECT COUNT(*) FROM users WHERE uname=? AND pwd=?";

private void someMethod() {
    Cursor c = db.rawQuery(SQL_STATEMENT, new String[] { loginname, loginpass });
    ...
}

22

ধরে dbনিলাম আপনার ইতিমধ্যে একটি ডেটাবেস ( ) সংযোগ স্থাপন করা হয়েছে, আমি মনে করি সর্বাধিক মার্জিত উপায় হচ্ছে Cursorক্লাসে লেগে থাকা, এবং এর মতো কিছু করা:

String selection = "uname = ? AND pwd = ?";
String[] selectionArgs = {loginname, loginpass};
String tableName = "YourTable";
Cursor c = db.query(tableName, null, selection, selectionArgs, null, null, null);
int result = c.getCount();
c.close();
return result;

4
আপনার কমপক্ষে একটি কলাম নির্দিষ্ট করা উচিত। নাল পাস করলে সমস্ত কলাম ফিরে আসবে, যা ব্যবহার করা হচ্ছে না এমন স্টোরেজ থেকে ডেটা পড়া রোধ করতে নিরুৎসাহিত করা হয়। # সুপারফ্যামটারগুলি
redochka

প্রকৃতপক্ষে প্রয়োজনীয় তথ্য যদি কেবল একটি গণনা হয় তবে একটি কলাম (উদাহরণ হিসাবে আইডি) পুনরুদ্ধার করা যথেষ্ট পরিমাণে বেশি হবে
এলোই নাভারো

12

গণনা কলাম কীভাবে পাবেন

final String DATABASE_COMPARE = "select count(*) from users where uname="+loginname+ "and pwd="+loginpass;

int sometotal = (int) DatabaseUtils.longForQuery(db, DATABASE_COMPARE, null);

এটি সবচেয়ে সংক্ষিপ্ত এবং সুনির্দিষ্ট বিকল্প। কার্সারগুলি এবং তাদের বন্ধ করার হ্যান্ডেল করার দরকার নেই।


আশ্চর্যজনক - চিরকালের জন্য অ্যান্ড্রয়েডের সাথে কাজ করে যাচ্ছিল এবং এই ডেটাবেস ইউটিসগুলি সম্পর্কে কখনই জানত না - গুগলের সেখানে ব্যবহারের ক্ষেত্রে আরও ভাল হওয়া উচিত ...
স্লট করুন

6

আপনি যদি কন্টেন্টপ্রোভাইডার ব্যবহার করছেন তবে আপনি ব্যবহার করতে পারেন:

Cursor cursor = getContentResolver().query(CONTENT_URI, new String[] {"count(*)"},
            uname=" + loginname + " and pwd=" + loginpass, null, null);
    cursor.moveToFirst();
    int count = cursor.getInt(0);

6

আপনি যদি রেকর্ডের গণনা পেতে চান তবে আপনাকে কোনও ক্ষেত্রের দ্বারা গ্রুপটি প্রয়োগ করতে হবে বা নীচের কোয়েরিটি প্রয়োগ করতে হবে।

পছন্দ

db.rawQuery("select count(field) as count_record from tablename where field =" + condition, null);

5

আর একটি উপায় ব্যবহার করা হবে:

myCursor.getCount();

কার্সারের মতো:

Cursor myCursor = db.query(table_Name, new String[] { row_Username }, 
row_Username + " =? AND " + row_Password + " =?",
new String[] { entered_Password, entered_Password }, 
null, null, null);

যদি আপনি কাঁচা কোয়েরি থেকে দূরে সরে যাওয়ার কথা ভাবতে পারেন।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.