অ্যান্ড্রয়েডে এসকি্লাইটে প্রস্তুত বিবৃতি কীভাবে ব্যবহার করব?


100

অ্যান্ড্রয়েডে এসকি্লাইটে প্রস্তুত বিবৃতি কীভাবে ব্যবহার করব?


10
গৃহীত উত্তর পরিবর্তন বিবেচনা করুন।
সুরগাচ

10
সম্মত হন - উত্তরটি পরিবর্তন করার বিষয়ে বিবেচনা করুন ... পশুর মানসিকতা গৃহীত উত্তরগুলিকে উজ্জীবিত করেছে, যখন আরও ভাল সমাধানের উপস্থিতি রয়েছে।
গুডগুইস_অ্যাক্টিভেট

4
পাবলো, দয়া করে গৃহীত উত্তরটি পরিবর্তন করুন ... প্রদত্ত উদাহরণটি এমনকি চালায় না। এবং আমাদের ডাউনভোটগুলি এটি আনপিন করার জন্য পর্যাপ্ত নয়।
স্পার্ক

উত্তর:


20

আমি অ্যান্ড্রয়েডে সর্বদা প্রস্তুত বিবৃতি ব্যবহার করি, এটি বেশ সহজ:

SQLiteDatabase db = dbHelper.getWritableDatabase();
SQLiteStatement stmt = db.compileStatement("INSERT INTO Country (code) VALUES (?)");
stmt.bindString(1, "US");
stmt.executeInsert();

82
আমি জানি না যে এই উত্তরে এতগুলি ভোট কীভাবে হতে পারে। এসকিউএলআইটিস্টেটমেন্ট # এক্সিকিউটটি স্কেল ক্যোয়ারীগুলির জন্য ব্যবহার করা উচিত নয়, কেবলমাত্র বিবৃতি। দয়া করে বিকাশকারী.অ্যান্ড্রয়েড
রেফারেন্স /

9
তাহলে আপনার কীভাবে ডেটা অনুসন্ধানের জন্য প্রস্তুত বিবৃতি ব্যবহার করার কথা?
হুয়ান মেন্ডেস

12
নোট যেটিতে SQLiteStatement.bindXXX()1-ভিত্তিক সূচক রয়েছে, সর্বাধিকের মতো 0-ভিত্তিক নয়।
সিমুল্যান্ট

6
@ জেসনহডগিনস কেন কেবল আপনার নির্বাচনকে একটি INSERT দিয়ে প্রতিস্থাপন করবেন না? আমি কেবল এই থ্রেড থেকে এসেছি , যেখানে আপনি একটি শিক্ষানবিশকে বিভ্রান্ত করেছেন
কীজার

35
গোষ্ঠী মানসিকতার নিখুঁত উদাহরণ যা সম্পূর্ণরূপে ভুল যে উত্তরটিকে সমর্থন করে এবং গ্রহণ করে

168

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

SQLiteStatementএসকিউএল স্টেটমেন্টগুলির সাথে ব্যবহার করা বোঝায় যা একাধিক মান ফেরত দেয় না। (এর অর্থ আপনি এগুলি বেশিরভাগ প্রশ্নের জন্য ব্যবহার করবেন না)) নীচে কয়েকটি উদাহরণ দেওয়া হল:

একটি টেবিল তৈরি করুন

String sql = "CREATE TABLE table_name (column_1 INTEGER PRIMARY KEY, column_2 TEXT)";
SQLiteStatement stmt = db.compileStatement(sql);
stmt.execute();

execute()পদ্ধতি একটি মান ফেরত দেয় না, তাই এটি দিয়ে তৈরি এবং ড্রপ ব্যবহার করতে উপযুক্ত কিন্তু, নির্বাচন ঢোকান সঙ্গে ব্যবহার করা DELETE উদ্দেশ্যে, এবং কারণ আপডেট এই রিটার্ন মান। (তবে এই প্রশ্নটি দেখুন ))

মান সন্নিবেশ করান

String sql = "INSERT INTO table_name (column_1, column_2) VALUES (57, 'hello')";
SQLiteStatement statement = db.compileStatement(sql);
long rowId = statement.executeInsert();

মনে রাখবেন যে executeInsert()পদ্ধতিটি পরিবর্তে ব্যবহৃত হয় execute()। অবশ্যই, আপনি সর্বদা প্রতিটি সারিতে একই জিনিস প্রবেশ করতে চান না। তার জন্য আপনি বাইন্ডিং ব্যবহার করতে পারেন ।

String sql = "INSERT INTO table_name (column_1, column_2) VALUES (?, ?)";
SQLiteStatement statement = db.compileStatement(sql);

int intValue = 57;
String stringValue = "hello";

statement.bindLong(1, intValue); // 1-based: matches first '?' in sql string
statement.bindString(2, stringValue);  // matches second '?' in sql string

long rowId = statement.executeInsert();

সাধারণত আপনি যখন কোনও কিছু দ্রুত (কোনও INSERT এর মতো) পুনরাবৃত্তি করতে চান তখন আপনি প্রস্তুত বিবৃতি ব্যবহার করেন। প্রস্তুত বিবৃতিটি এমন করে তোলে যাতে এসকিউএল স্টেটমেন্টটি প্রতিবার পার্স এবং সংকলন করতে না হয়। লেনদেন ব্যবহার করে আপনি জিনিসগুলিকে আরও বেশি গতি দিতে পারেন । এটি সমস্ত পরিবর্তন একবারে প্রয়োগ করার অনুমতি দেয়। এখানে একটি উদাহরণ:

String stringValue = "hello";
try {

    db.beginTransaction();
    String sql = "INSERT INTO table_name (column_1, column_2) VALUES (?, ?)";
    SQLiteStatement statement = db.compileStatement(sql);

    for (int i = 0; i < 1000; i++) {
        statement.clearBindings();
        statement.bindLong(1, i);
        statement.bindString(2, stringValue + i);
        statement.executeInsert();
    }

    db.setTransactionSuccessful(); // This commits the transaction if there were no exceptions

} catch (Exception e) {
    Log.w("Exception:", e);
} finally {
    db.endTransaction();
}

লেনদেন এবং ডেটাবেস সন্নিবেশন সম্পর্কিত আরও কিছু ভাল তথ্যের জন্য এই লিঙ্কগুলি দেখুন।

সারি আপডেট করুন

এটি একটি মৌলিক উদাহরণ। আপনি উপরের বিভাগ থেকে ধারণাগুলিও প্রয়োগ করতে পারেন।

String sql = "UPDATE table_name SET column_2=? WHERE column_1=?";
SQLiteStatement statement = db.compileStatement(sql);

int id = 7;
String stringValue = "hi there";

statement.bindString(1, stringValue);
statement.bindLong(2, id);

int numberOfRowsAffected = statement.executeUpdateDelete();

সারি মুছুন

executeUpdateDelete()পদ্ধতি মুছে বিবৃতি ব্যবহার করা যেতে পারে এবং API 11. চালু হয় দেখুন এই Q & A-

এখানে একটি উদাহরণ।

try {

    db.beginTransaction();
    String sql = "DELETE FROM " + table_name +
            " WHERE " + column_1 + " = ?";
    SQLiteStatement statement = db.compileStatement(sql);

    for (Long id : words) {
        statement.clearBindings();
        statement.bindLong(1, id);
        statement.executeUpdateDelete();
    }

    db.setTransactionSuccessful();

} catch (SQLException e) {
    Log.w("Exception:", e);
} finally {
    db.endTransaction();
}

প্রশ্ন

সাধারণত যখন আপনি কোনও ক্যোয়ারী চালান, আপনি প্রচুর সারি দিয়ে একটি কার্সার ফিরে পেতে চান। SQLiteStatementযদিও এর জন্য তা নয় । আপনার কেবলমাত্র কোনও সাধারণ ফলাফলের প্রয়োজন হয় না, ডাটাবেসে সারি সংখ্যাগুলির মতো, যা আপনি এটি করতে পারেনsimpleQueryForLong()

String sql = "SELECT COUNT(*) FROM table_name";
SQLiteStatement statement = db.compileStatement(sql);
long result = statement.simpleQueryForLong();

সাধারণত আপনি কার্সার পেতে এসকিউএলডিটিবেসসquery() পদ্ধতিটি চালাবেন

SQLiteDatabase db = dbHelper.getReadableDatabase();
String table = "table_name";
String[] columnsToReturn = { "column_1", "column_2" };
String selection = "column_1 =?";
String[] selectionArgs = { someValue }; // matched to "?" in selection
Cursor dbCursor = db.query(table, columnsToReturn, selection, selectionArgs, null, null, null);

প্রশ্নের সম্পর্কে আরও বিশদ বিবরণের জন্য এই উত্তরটি দেখুন ।


6
কেবলমাত্র একটি অনুস্মারক: .বাইন্ডস্ট্রিং / .বাইন্ডলং / ... পদ্ধতিগুলি সমস্ত 1-ভিত্তিক।
ভিট্টি

আমি অ্যান্ড্রয়েড সুবিধাগুলি যেমন। ক্যোয়ারি, .নসার্ট এবং। ডিলিটের অধীনে সন্ধান করছিলাম এবং লক্ষ্য করেছি যে তারা হুডের নীচে এসকিউএলসাইট ব্যবহার করে। নিজের বিবৃতি তৈরির পরিবর্তে সুবিধামত পদ্ধতি ব্যবহার করা কি সহজ হবে না?
নিকোলস ক্যারাসকো

@ নিকোলাসকারাসকো, আমি যখন এ নিয়ে কাজ করেছি তখন অনেকক্ষণ হয়ে গেছে তাই আমি এখন কিছুটা মরিচা পড়েছি। অনুসন্ধান এবং একক সন্নিবেশ, আপডেট এবং মুছে ফেলার জন্য, আমি অবশ্যই সুবিধার পদ্ধতিগুলি ব্যবহার করব। তবে, আপনি যদি ভর সন্নিবেশ, আপডেট বা মুছে ফেলছেন তবে আমি লেনদেনের পাশাপাশি প্রস্তুত বিবৃতি বিবেচনা করব। SQLiteStatement হুডের অধীনে ব্যবহৃত হচ্ছে এবং সুবিধার পদ্ধতিগুলি যথেষ্ট ভাল কিনা তা আমি এর সাথে কথা বলতে পারি না। আমি অনুমান করি আমি বলব, যদি সুবিধা পদ্ধতিগুলি আপনার জন্য দ্রুত পর্যাপ্ত সম্পাদন করে তবে তাদের ব্যবহার করুন।
সুরগাচ

আপনি ক্লিয়ারবাইন্ডিংস () ব্যবহার করেন কেন? আপনি কোনও শর্ত ছাড়াই আপনার সমস্ত মানকে আবদ্ধ করেন। এগুলিকে প্রথমে নাল এবং আসল মান হিসাবে সেট করা আমার কাছে বোধগম্য নয়।
অবিশ্বাস্য জানুয়ারী

@ থ্রিঙ্ক্রেডিবলজান, আমি নিশ্চিতভাবে জানি না। এটি প্রয়োজনীয় নাও হতে পারে এবং বাইন্ডিংগুলি পরিষ্কার না করে আপনি এটি ব্যবহার করে দেখতে পারেন এটি কোনও পার্থক্য করে কিনা। তবে, এটি বলেছিল, কলিং clearBindings()তাদের কেবল সেট করে না null( উত্স কোড দেখুন )। আমি এটিকে রাষ্ট্র সাফ করার মত দেখছি যাতে কোনও কিছুই এটি পূর্বের লুপ থেকে প্রভাবিত করে না। যদিও এটি প্রয়োজনীয় নয়। আমি মন্তব্য করতে জানে এমন কারও জন্য আমি খুশি হব।
সুরগাচ

23

যদি আপনি ফেরতের বিনিময়ে কার্সার চান, তবে আপনি এটির মতো কিছু বিবেচনা করতে পারেন:

SQLiteDatabase db = dbHelper.getWritableDatabase();

public Cursor fetchByCountryCode(String strCountryCode)
{
    /**
     * SELECT * FROM Country
     *      WHERE code = US
     */
    return cursor = db.query(true, 
        "Country",                        /**< Table name. */
        null,                             /**< All the fields that you want the 
                                                cursor to contain; null means all.*/
        "code=?",                         /**< WHERE statement without the WHERE clause. */
        new String[] { strCountryCode },    /**< Selection arguments. */
        null, null, null, null);
}

/** Fill a cursor with the results. */
Cursor c = fetchByCountryCode("US");

/** Retrieve data from the fields. */
String strCountryCode = c.getString(cursor.getColumnIndex("code"));

/** Assuming that you have a field/column with the name "country_name" */
String strCountryName = c.getString(cursor.getColumnIndex("country_name"));

আপনি আরও একটি সম্পূর্ণ চাইলে এই স্নিপেট জেনস্ক্রিপ্টগুলি দেখুন । নোট করুন যে এটি একটি প্যারামিটারাইজড এসকিউএল কোয়েরি, সুতরাং সংক্ষেপে এটি একটি প্রস্তুত বিবৃতি।


উপরের কোডটিতে ছোট্ট ভুল: এটি "নতুন স্ট্রিং {{strCountryCode instead" এর পরিবর্তে "নতুন স্ট্রিং [] {strCountryCode}" হওয়া উচিত।
পিয়েরে-লুক সিমার্ড

আপনি ডেটা পুনরুদ্ধার করার আগে আপনাকে কার্সারটি সরানো দরকার
চিন

9

জেসনহডগিনস উদাহরণটি কাজ করবে না। আপনি একটি কোয়েরি কার্যকর করতে stmt.execute()এবং একটি মান (বা ক Cursor) ফিরে পেতে পারেন না ।

আপনি কেবলমাত্র এমন স্টেটমেন্টগুলিকেই প্রাকপাইল করতে পারেন যা হয় কোনওভাবেই কোনও সারি দেয় না (যেমন একটি সন্নিবেশ, বা সারণী বিবৃতি তৈরি করুন) বা একটি একক সারি এবং কলাম, (এবং ব্যবহার simpleQueryForLong()বা simpleQueryForString())।


1

কার্সার পেতে, আপনি একটি সংকলিত স্টেটমেন্ট ব্যবহার করতে পারবেন না। তবে, আপনি যদি একটি সম্পূর্ণ প্রস্তুত এসকিউএল বিবৃতি ব্যবহার করতে চান তবে আমি জবায়েজের পদ্ধতির একটি অভিযোজন প্রস্তাব করছি ... এর db.rawQuery()পরিবর্তে ব্যবহার করে db.query()

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