অ্যান্ড্রয়েডে এসকি্লাইটে প্রস্তুত বিবৃতি কীভাবে ব্যবহার করব?
অ্যান্ড্রয়েডে এসকি্লাইটে প্রস্তুত বিবৃতি কীভাবে ব্যবহার করব?
উত্তর:
আমি অ্যান্ড্রয়েডে সর্বদা প্রস্তুত বিবৃতি ব্যবহার করি, এটি বেশ সহজ:
SQLiteDatabase db = dbHelper.getWritableDatabase();
SQLiteStatement stmt = db.compileStatement("INSERT INTO Country (code) VALUES (?)");
stmt.bindString(1, "US");
stmt.executeInsert();
SQLiteStatement.bindXXX()
1-ভিত্তিক সূচক রয়েছে, সর্বাধিকের মতো 0-ভিত্তিক নয়।
অ্যান্ড্রয়েডে প্রস্তুত এসকিউএলাইট স্টেটমেন্টের জন্য এসকিউএলসাইট রয়েছে । প্রস্তুত বিবৃতিগুলি আপনাকে কার্যকারিতা গতিতে সহায়তা করে (বিশেষত এমন বিবৃতিগুলির জন্য যা একাধিকবার কার্যকর করা প্রয়োজন) এবং ইনজেকশন আক্রমণ থেকে রক্ষা করতে সহায়তা করে। প্রস্তুত বিবৃতিগুলির উপর সাধারণ আলোচনার জন্য এই নিবন্ধটি দেখুন ।
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);
প্রশ্নের সম্পর্কে আরও বিশদ বিবরণের জন্য এই উত্তরটি দেখুন ।
clearBindings()
তাদের কেবল সেট করে না null
( উত্স কোড দেখুন )। আমি এটিকে রাষ্ট্র সাফ করার মত দেখছি যাতে কোনও কিছুই এটি পূর্বের লুপ থেকে প্রভাবিত করে না। যদিও এটি প্রয়োজনীয় নয়। আমি মন্তব্য করতে জানে এমন কারও জন্য আমি খুশি হব।
যদি আপনি ফেরতের বিনিময়ে কার্সার চান, তবে আপনি এটির মতো কিছু বিবেচনা করতে পারেন:
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"));
আপনি আরও একটি সম্পূর্ণ চাইলে এই স্নিপেট জেনস্ক্রিপ্টগুলি দেখুন । নোট করুন যে এটি একটি প্যারামিটারাইজড এসকিউএল কোয়েরি, সুতরাং সংক্ষেপে এটি একটি প্রস্তুত বিবৃতি।
জেসনহডগিনস উদাহরণটি কাজ করবে না। আপনি একটি কোয়েরি কার্যকর করতে stmt.execute()
এবং একটি মান (বা ক Cursor
) ফিরে পেতে পারেন না ।
আপনি কেবলমাত্র এমন স্টেটমেন্টগুলিকেই প্রাকপাইল করতে পারেন যা হয় কোনওভাবেই কোনও সারি দেয় না (যেমন একটি সন্নিবেশ, বা সারণী বিবৃতি তৈরি করুন) বা একটি একক সারি এবং কলাম, (এবং ব্যবহার simpleQueryForLong()
বা simpleQueryForString()
)।