Ошибка блокировки базы данных происходит при запуске службы - PullRequest
0 голосов
/ 17 октября 2011

У меня есть сервис, который будет обновлять базу данных Sqllite данными каждые 10 минут с помощью сервиса. Я открыл соединение с базой данных и закрыл соединение, когда данные обновлялись.

В моем приложении яна разных страницах, где происходило обновление базы данных. Я также открыл соединение с базой данных и закрыл соединение на каждой странице для обновления данных.

Проблема в том, что во время работы службы я не могу обновитьДанные в sqlite были отправлены через мое приложение, когда в сервисе открылось согласие.

Есть ли способ запустить обновление базы данных одновременно с использованием сервиса и приложения.

Поможет ли кто-нибудь с примерами.

Я вызываю функцию в моем сервисе, как указано ниже (код)

public class service_helper extends Service {
    public static final String TAG = "Service";
    private NotificationManager mNM;
    private DatabaseAdapter dbAdapter;
    private service_updator serviceUpdator;
    private int NOTIFICATION = 1;
    private Timer timer = new Timer();
    @Override
    public IBinder onBind(Intent arg0) {

        return null;

    }

    @Override
    public void onCreate() {

        super.onCreate();


        serviceUpdator = new service_updator(this);
        dbAdapter = new DatabaseAdapter(this);
        dbAdapter.open();
        Toast.makeText(this, "Service created ...", Toast.LENGTH_LONG).show();   
        startService() ;
    }

    @Override
    public void onStart(Intent intent, int startid) {

    }

    @Override
    public void onDestroy() {
        timer.cancel();
        super.onDestroy();

        Toast.makeText(this, "Service destroyed ...", Toast.LENGTH_LONG).show();

    }

     private void startService()     
     {                   
         timer.scheduleAtFixedRate(new mainTask(), 0, 250000);   
         }    
     private class mainTask extends TimerTask    
     {         
         public void run()    
         {           
             try {
                serviceUpdator.UploadData();
                Log.d(TAG, "Service");
            } catch (ParserConfigurationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

            }
             }    
         } 



    private Runnable threadBody = new Runnable() {


             public void run() {

            try {

                serviceUpdator.UploadData();

                Log.d(TAG, "Service");
            } catch (ParserConfigurationException e) {
                            }

        }




    };


    }

UploadData() Function Code

    dbAdapter = new DatabaseAdapter(this.context);
            dbAdapter.open();
            Long transactionType = null;
            String transactionData = null;
            String sql = "Select * from tblTransaction where PKTransaction >?";
            Cursor cursorTransaction = dbAdapter.ExecuteRawQuery(sql, "-1");
            cursorTransaction.moveToFirst();
            dbAdapter.close();

                  for (int i = 0; i < cursorTransaction.getCount(); i++) {
                  }

    dbAdapter.close();

Application Code

    private void SaveSortOrder() throws Exception {
            try {
                String server1IPAddress = "";
                String server2IPAddress = "";
                String deviceId = "";

                Cursor cursorTransaction;
                Cursor cursorAdmin;

                DatabaseAdapter dbAdapter;
                DataXmlExporter dataXmlExporter;
                admin_helper adminhelper;
                Date date = new Date();

                SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
                String RevisedEstimatedDate = sdf.format(date);

                adminhelper = new admin_helper(this);
                cursorAdmin = adminhelper.GetAdminDetails();
                if (cursorAdmin.moveToFirst())
                    server1IPAddress = cursorAdmin.getString(cursorAdmin
                            .getColumnIndex("RemoteServer1IPAddress"));
                server2IPAddress = cursorAdmin.getString(cursorAdmin
                        .getColumnIndex("RemoteServer2IPAddress"));
                deviceId = cursorAdmin.getString(cursorAdmin
                        .getColumnIndex("DeviceID"));
                cursorAdmin.close();

                ContentValues initialSortOrder = new ContentValues();
                ContentValues initialTransaction = new ContentValues();
                for (int i = 0; i < ListSortOrder.getAdapter().getCount(); i++) {

                    HashMap result = (HashMap) ListSortOrder.getItemAtPosition(i);
                    View vListSortOrder;
                    vListSortOrder = ListSortOrder.getChildAt(i);

                    TextView Sort_DeliveryOrder = (TextView) vListSortOrder
                            .findViewById(R.id.et_Sort_Order);

                    initialSortOrder.put("DeliveryOrder", Sort_DeliveryOrder
                            .getText().toString());
                    dbAdapter = new DatabaseAdapter(this);
                    dbAdapter.open();

                    dbAdapter.BeginTransaction();
                    dbAdapter.UpdateRecord("tblDelivery", initialSortOrder,
                            "PKDelivery" + "="
                                    + result.get("Sort_PKDelivery").toString(),
                            null);

                    dataXmlExporter = new DataXmlExporter(this);
                    dataXmlExporter.StartDataSet();

                    String sqlTransaction = "Select 5 as TransactionType,'Update Delivery Order' as Description,'"
                            + result.get("Sort_PKDelivery").toString()
                            + "' as FKDelivery, "
                            + " deviceId as DeviceID ,'"
                            + Sort_DeliveryOrder.getText().toString()
                            + "' as DeliveryOrder ,date() as TransactionUploadDate,time() as TransactionUploadTime from tblAdmin where PKAdmin > ?";

                    cursorTransaction = dbAdapter.ExecuteRawQuery(sqlTransaction,
                            "-1");
                    dataXmlExporter.AddRowandColumns(cursorTransaction,
                            "Transaction");
                    String XMLTransactionData = dataXmlExporter.EndDataSet();

                    try {

                        if ((server1IPAddress != "") && (server2IPAddress != "")) {
                            try {
                                if (server1IPAddress != "") {
                                    InsertUploadedTrancasctionDetails(
                                            server1IPAddress, deviceId,
                                            XMLTransactionData);
                                }
                            } catch (Exception exception) {

                                if ((server1IPAddress != server2IPAddress)
                                        && (server2IPAddress != "")) {
                                    InsertUploadedTrancasctionDetails(
                                            server2IPAddress, deviceId,
                                            XMLTransactionData);
                                }
                            }

                        }
                    } catch (Exception exception) {

                        initialTransaction
                                .put("ReceivedDate", RevisedEstimatedDate);
                        initialTransaction.put("TransactionData",
                                XMLTransactionData);

                        dbAdapter.InsertRecord("tblTransaction", "",
                                initialTransaction);

                    }

                    dbAdapter.SetSucessfulTransaction();
                    dbAdapter.EndTransaction();
                    dbAdapter.close();

                }
            } catch (Exception exception) {
                throw exception;
            }
        }

1 Ответ

0 голосов
/ 17 октября 2011

У меня была похожая проблема, когда я перешел на Honeycomb, он начал выдавать исключение SQLiteDatabaseLockedException. Я отсортировал его, поместив контент-провайдер поверх своей базы данных, а затем Android решает все проблемы с потоками.Вы можете, конечно, попытаться найти проблему с многопоточностью, но это определенно исправит ее:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...