অ্যান্ড্রয়েড ডাটাবেস লেনদেন


84

আমি একটি ডাটাবেস তৈরি করেছি। আমি লেনদেন করতে চাই সেই সময় টেবিলে SaveCustomer()রেকর্ড সন্নিবেশ করতে একাধিক বিবৃতি রয়েছে Customer, CustomerControl, Profile, Payment

যখন কোনও ব্যবহারকারী SaveCustomer()পদ্ধতিতে কল করে তখন সেই ডেটা এই 4 টি টেবিলগুলিতে যাবে so সুতরাং আমি কীভাবে লেনদেন করতে পারি? যদি কোনও টেবিল সন্নিবেশগুলি ব্যর্থ হয় তবে সমস্ত কিছু রোল করতে হবে। উদাহরণস্বরূপ, যখন তৃতীয় সারণী রেকর্ডটি সন্নিবেশ করায় আমি একটি ত্রুটি পেয়েছি, তারপরে আগের দুটি টেবিলের সন্নিবেশ রেকর্ডগুলিও আবার রোল করতে হবে।

আমার কোড দেখুন:

public void saveCustomer(){
    DBAdapter dbAdapter = DBAdapter.getDBAdapterInstance(RetailerOrderKeyActivity.this);
    dbAdapter.openDataBase();
    ContentValues initialValues = new ContentValues();
    initialValues.put("CustomerName",customer.getName());
    initialValues.put("Address",customer.getAddress());
    initialValues.put("CustomerPID",strPID);
    initialValues.put("Date",strDateOnly);
    long n = dbAdapter.insertRecordsInDB("Customer", null, initialValues);

}

একইভাবে অন্যান্য বিবৃতি সেখানে।

ডিবিএ বিভাগের কোডটি হ'ল:

public long insertRecordsInDB(String tableName, String nullColumnHack,ContentValues initialValues) {
    long n =-1;
    try {
        myDataBase.beginTransaction();
        n = myDataBase.insert(tableName, nullColumnHack, initialValues);

        myDataBase.endTransaction();
        myDataBase.setTransactionSuccessful();
    } catch (Exception e) {
        // how to do the rollback 
        e.printStackTrace();
    }

    return n;
}

এটি সম্পূর্ণ কোড:

public class DBAdapter extends SQLiteOpenHelper {

    private static String DB_PATH = "/data/data/com.my.controller/databases/";
    private static final String DB_NAME = "customer";
    private SQLiteDatabase myDataBase;
    private final Context myContext;
    private static DBAdapter mDBConnection;


    private DBAdapter(Context context) {
        super(context, DB_NAME, null, 1);
        this.myContext = context;
        DB_PATH = "/data/data/"
                + context.getApplicationContext().getPackageName()
                + "/databases/";
        // The Android's default system path of your application database is
        // "/data/data/mypackagename/databases/"
    }


    public static synchronized DBAdapter getDBAdapterInstance(Context context) {
        if (mDBConnection == null) {
            mDBConnection = new DBAdapter(context);
        }
        return mDBConnection;
    }


    public void createDataBase() throws IOException {
        boolean dbExist = checkDataBase();
        if (dbExist) {
            // do nothing - database already exist
        } else {
            // By calling following method 
            // 1) an empty database will be created into the default system path of your application 
            // 2) than we overwrite that database with our database.
            this.getReadableDatabase();
            try {
                copyDataBase();
            } catch (IOException e) {
                throw new Error("Error copying database");
            }
        }
    }


    private boolean checkDataBase() {
        SQLiteDatabase checkDB = null;

        try {
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READONLY);

        } catch (SQLiteException e) {
            // database does't exist yet.
        }
        if (checkDB != null) {
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }


    private void copyDataBase() throws IOException {
        InputStream myInput = myContext.getAssets().open(DB_NAME);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream myOutput = new FileOutputStream(outFileName);  
    byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }
            // Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();
    }

    /**
     * Open the database
     * @throws SQLException
     */
    public void openDataBase() throws SQLException {
        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);      
    }


    @Override
    public synchronized void close() {
        if (myDataBase != null)
            myDataBase.close();
        super.close();
    }

    /**
     * Call on creating data base for example for creating tables at run time
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
    }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("ALTER TABLE WMPalmUploadControl ADD Testing int");

    }

    public void upgradeDb(){
        onUpgrade(myDataBase, 1, 2);
    }

    public Cursor selectRecordsFromDB(String tableName, String[] tableColumns,
            String whereClase, String whereArgs[], String groupBy,
            String having, String orderBy) {
        return myDataBase.query(tableName, tableColumns, whereClase, whereArgs,
                groupBy, having, orderBy);
    }


    public ArrayList<ArrayList<String>> selectRecordsFromDBList(String tableName, String[] tableColumns,
            String whereClase, String whereArgs[], String groupBy,
            String having, String orderBy) {        

        ArrayList<ArrayList<String>> retList = new ArrayList<ArrayList<String>>();
          ArrayList<String> list = new ArrayList<String>();
          Cursor cursor = myDataBase.query(tableName, tableColumns, whereClase, whereArgs,
                    groupBy, having, orderBy);        
          if (cursor.moveToFirst()) {
             do {
                 list = new ArrayList<String>();
                 for(int i=0; i<cursor.getColumnCount(); i++){                   
                     list.add( cursor.getString(i) );
                 }   
                 retList.add(list);
             } while (cursor.moveToNext());
          }
          if (cursor != null && !cursor.isClosed()) {
             cursor.close();
          }
          return retList;

    }   


    public long insertRecordsInDB(String tableName, String nullColumnHack,ContentValues initialValues) {
        long n =-1;
        try {
            myDataBase.beginTransaction();
            n = myDataBase.insert(tableName, nullColumnHack, initialValues);

            myDataBase.endTransaction();
            myDataBase.setTransactionSuccessful();
        } catch (Exception e) {
            // how to do the rollback 
            e.printStackTrace();
        }

        return n;
    }


    public boolean updateRecordInDB(String tableName,
            ContentValues initialValues, String whereClause, String whereArgs[]) {
        return myDataBase.update(tableName, initialValues, whereClause,
                whereArgs) > 0;             
    }

    public int updateRecordsInDB(String tableName,
            ContentValues initialValues, String whereClause, String whereArgs[]) {
        return myDataBase.update(tableName, initialValues, whereClause, whereArgs);     
    }


    public int deleteRecordInDB(String tableName, String whereClause,
            String[] whereArgs) {
        return myDataBase.delete(tableName, whereClause, whereArgs);
    }


    public Cursor selectRecordsFromDB(String query, String[] selectionArgs) {
        return myDataBase.rawQuery(query, selectionArgs);       
    }


    public ArrayList<ArrayList<String>> selectRecordsFromDBList(String query, String[] selectionArgs) {       
          ArrayList<ArrayList<String>> retList = new ArrayList<ArrayList<String>>();
          ArrayList<String> list = new ArrayList<String>();
          Cursor cursor = myDataBase.rawQuery(query, selectionArgs);            
          if (cursor.moveToFirst()) {
             do {
                 list = new ArrayList<String>();
                 for(int i=0; i<cursor.getColumnCount(); i++){                   
                     list.add( cursor.getString(i) );
                 }   
                 retList.add(list);
             } while (cursor.moveToNext());
          }
          if (cursor != null && !cursor.isClosed()) {
             cursor.close();
          }
          return retList;
       }

}

এইচটিসি ডিজায়ারে ডাটাবেস লক ইস্যু

সারণী ডেটা tingোকানোর সময় যদি কোনও সমস্যা দেখা দেয় তবে আমি ফিরে যেতে চাই।

আমাকে সাহায্য করুন

ধন্যবাদ

আমি এই একই সম্পর্কিত প্রশ্নটি দেখেছি:

উত্তর:


279

আসলে আপনি ভুল করছেন। আপনার যদি ডাটাবেসে সন্নিবেশ করতে একাধিক রেকর্ড থাকে বা ডাটাবেস টেবিলের কোনও একটিতে ডেটা inোকাতে সমস্যা হয় তবে অন্য টেবিল থেকে আপনার যদি রোলব্যাক করতে হয় তবে আপনাকে লেনদেন শুরু করতে হবে।

উদাহরণ স্বরূপ

আপনার দুটি টেবিল রয়েছে

এখন আপনি এই দুটি সারণীতে ডেটা toোকাতে চান তবে টেবিলগুলিতে ডেটা ofোকানোর সময় কোনও ত্রুটি পেলে আপনাকে রোলব্যাক লেনদেন করতে হবে।

এখন আপনি টেবিল এ তে সাফল্যের সাথে ডেটা সন্নিবেশ করিয়েছেন এবং এখন আপনি টেবিল বি তে তথ্য সন্নিবেশ করার চেষ্টা করছেন বি টেবিলের তথ্য সন্নিবেশ করার সময় আপনি যদি ত্রুটি পান তবে আপনাকে টেবিল এ থেকে প্রাসঙ্গিক ডেটা মুছতে হবে যার অর্থ আপনি লেনদেন রোলব্যাক করতে হবে।

আপনি কীভাবে অ্যান্ড্রয়েডে ডাটাবেস লেনদেন ব্যবহার করতে পারেন

  1. আপনি যদি লেনদেন শুরু করতে চান তবে একটি পদ্ধতি আছে beginTransaction()
  2. আপনি যদি লেনদেন করতে চান তবে একটি পদ্ধতি আছে setTransactionSuccessful()যা ডাটাবেসে মানগুলি প্রতিশ্রুতিবদ্ধ
  3. আপনি যদি লেনদেন শুরু করে থাকেন তবে আপনার লেনদেন বন্ধ করতে হবে তাই এমন একটি পদ্ধতি রয়েছে endTransaction()যা আপনার ডাটাবেস লেনদেনকে শেষ করে দেবে

এখন দুটি প্রধান পয়েন্ট আছে

  1. আপনি যদি লেনদেন সফল করতে চান তবে আপনাকে লিখতে হবে setTransactionSuccessful()এবং তারপরেওendTransaction() পরেওbeginTransaction()
  2. আপনি যদি নিজের লেনদেনটি রোলব্যাক করতে চান তবে আপনার endTransaction()দ্বারা লেনদেনটি কমিট না করেই করা দরকারsetTransactionSuccessful()

আপনি এখান থেকে এসকিউএল ডাটাবেস লেনদেন সম্পর্কে বিস্তারিত তথ্য পেতে পারেন

তোমার ক্ষেত্রে

আপনি saveCustomer()চেষ্টা করুন এবং ব্লক ধরতে আপনার ফাংশন কল করতে পারেন

db.beginTransaction();
try {
    saveCustomer();
    db.setTransactionSuccessful();
} catch {
    //Error in between database transaction 
} finally {
    db.endTransaction();
}

11
endTransactionআপনার অবশেষে যুক্ত করা উচিত , আপনার চেষ্টা ব্লকে নয়।
ভ্যানসফ্যানেল

6
আপনি অবশেষে ঠিক করেছেন ভ্যানফ্যানেল ডাটাবেস লেনদেন বন্ধ করার সেরা জায়গা best আরও ভাল করার জন্য ধন্যবাদ
ধর্মেন্দ্র

25

আপনার নিজের ব্লগে নয়, endTransactionআপনার যুক্ত করা উচিতfinally

 finally {
     myDataBase.endTransaction();
   }

পরিষ্কার হিসাবে চিহ্নিত না করে যদি কোনও লেনদেন শেষ হয় তবে (সেটট্রান্সজেকশনসকে কল করে) পরিবর্তনগুলি ফিরিয়ে আনা হবে। অন্যথায় তারা প্রতিশ্রুতিবদ্ধ হবে।


4
তথ্যের জন্য ধন্যবাদ. আমার 'SaveCustomer () `এ আমি' দীর্ঘ n = dbAdapter.insertRecordsInDB (" গ্রাহক ", নাল, প্রারম্ভিক মূল্য) কল করতে যাচ্ছি; ' 4 বিভিন্ন রেকর্ড সহ সময়। এটি মাঝারি টেবিলটিতে এমনকি কোনও ত্রুটি দেখা দিলে কি এটি সমস্ত কিছু রোলব্যাক করবে I
কর্থিপন

17

লেনদেন ব্যবহার করে রেকর্ড সন্নিবেশ করান, এটি খুব দ্রুত

String sql = "INSERT INTO table (col1, col2) VALUES (?, ?)";
db.beginTransaction();

SQLiteStatement stmt = db.compileStatement(sql);
for (int i = 0; i < values.size(); i++) {
    stmt.bindString(1, values.get(i).col1);
    stmt.bindString(2, values.get(i).col2);
    stmt.execute();
    stmt.clearBindings();
}

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