Эмулятор может использовать базу данных, но устройство не - PullRequest
0 голосов
/ 06 апреля 2019

Приложение может использовать базу данных для вставки элементов в эмулятор. Но на моем устройстве оно не может использовать базу данных. При попытке выдает ошибку типа

2019-04-06 21:33:17.963 28735-28955/com.timucin.locationholder I/System.out: (HTTPLog)-Static: isSBSettingEnabled false

Вот как работает моя база данных

try {
                    MapsActivity.database = openOrCreateDatabase("Places",MODE_PRIVATE,null);
                    Cursor cursor = MapsActivity.database.rawQuery("SELECT * FROM places",null);
                    int nameIx = cursor.getColumnIndex("name");
                    int latitudeIx = cursor.getColumnIndex("latitude");
                    int longitudeIx = cursor.getColumnIndex("longitude");
                    while (cursor.moveToNext()) {
                        nameFromDatabase = cursor.getString(nameIx);
                        String latitudeFromDatabase = cursor.getString(latitudeIx);
                        String longitudeFromDatabase = cursor.getString(longitudeIx);
                        image = cursor.getBlob(3);
                        // names.add(nameFromDatabase);
                        Double l1 = Double.parseDouble(latitudeFromDatabase);
                        Double l2 = Double.parseDouble(longitudeFromDatabase);
                        //   System.out.println("coordinates:"+l1+","+l2);
                        locationFromDatabase = new LatLng(l1, l2);
                        names.add(nameFromDatabase);
                        locations.add(locationFromDatabase);
                        list.add(new Location(nameFromDatabase, image));
                        System.out.println(names);
                    }
                    System.out.println(names);
                    cursor.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
        }

1 Ответ

0 голосов
/ 07 апреля 2019

Хорошо, я скачал твой код и запустил его в AndroidStudio.Поэтому более современный способ избежать выполнения операций с базой данных в основном потоке - это делать это с исполнителями приложений.

Создайте новый класс в вашем проекте, который вызывает AppExecutors и выглядит следующим образом:

package com.timucin.locationholder;

import android.os.Handler;
import android.os.Looper;
import android.support.annotation.NonNull;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

public class AppExecutors {

    // For Singleton instantiation
    private static final Object LOCK = new Object();
    private static AppExecutors sInstance;
    private final Executor diskIO;
    private final Executor mainThread;
    private final Executor networkIO;

    private AppExecutors(Executor diskIO, Executor networkIO, Executor mainThread) {
        this.diskIO = diskIO;
        this.networkIO = networkIO;
        this.mainThread = mainThread;
    }

    public static AppExecutors getInstance() {
        if (sInstance == null) {
            synchronized (LOCK) {
                sInstance = new AppExecutors(Executors.newSingleThreadExecutor(),
                        Executors.newFixedThreadPool(3),
                        new MainThreadExecutor());
            }
        }
        return sInstance;
    }

    public Executor diskIO() {
        return diskIO;
    }

    public Executor mainThread() {
        return mainThread;
    }

    public Executor networkIO() {
        return networkIO;
    }

    private static class MainThreadExecutor implements Executor {
        private Handler mainThreadHandler = new Handler(Looper.getMainLooper());

        @Override
        public void execute(@NonNull Runnable command) {
            mainThreadHandler.post(command);
        }
    }
}

Теперь вы можете использовать это для запуска операций базы данных.Например, в функции MainActivitys onCreate.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final GridView gridView= (GridView) findViewById(R.id.gridView);
        list = new ArrayList<>();

        //Database Operations
        AppExecutors.getInstance().diskIO().execute(new Runnable() {
            @Override
            public void run() {
                try {
                    MapsActivity.database = openOrCreateDatabase("Places",MODE_PRIVATE,null);
                    Cursor cursor = MapsActivity.database.rawQuery("SELECT * FROM places",null);
                    int nameIx = cursor.getColumnIndex("name");
                    int latitudeIx = cursor.getColumnIndex("latitude");
                    int longitudeIx = cursor.getColumnIndex("longitude");
                    while (cursor.moveToNext()) {
                        nameFromDatabase = cursor.getString(nameIx);
                        String latitudeFromDatabase = cursor.getString(latitudeIx);
                        String longitudeFromDatabase = cursor.getString(longitudeIx);
                        image = cursor.getBlob(3);
                        // names.add(nameFromDatabase);
                        Double l1 = Double.parseDouble(latitudeFromDatabase);
                        Double l2 = Double.parseDouble(longitudeFromDatabase);
                        //   System.out.println("coordinates:"+l1+","+l2);
                        locationFromDatabase = new LatLng(l1, l2);
                        names.add(nameFromDatabase);
                        locations.add(locationFromDatabase);
                        list.add(new Location(nameFromDatabase, image));
                        adapter = new LocationListAdapter(getApplicationContext(), R.layout.location_items, list);
                        gridView.setAdapter(adapter);
                        System.out.println(names);
                    }
                    System.out.println(names);
                    cursor.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

И все готово.Вы должны сделать это со всеми операциями с вашей базой данных.На самом деле я не смог воспроизвести ошибку, которую вы получаете, поэтому я не знаю, решит ли она проблему.Но в любом случае выполнение операций с базой данных в главном потоке является плохой практикой и может привести к другим ошибкам.Попробуйте, я надеюсь, это поможет.

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