Table is empty when trying to access the database using RoomDB in Android Studio

74 views Asked by At

getAllLandmarks() returns nothing because table is empty as shown in database inspector. I am trying to set up roomDB in Android Studio and creates googlemap marker by extracting the lang and longitude from the database.

Problem ScreenShot:

enter image description here

What it should look like

enter image description here

MapFragment.java

package com.example.whereswaldo.ui.notifications;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.LiveData;

import com.example.whereswaldo.Landmarks;
import com.example.whereswaldo.LandmarksDAO;
import com.example.whereswaldo.R;
import com.example.whereswaldo.database;
import com.example.whereswaldo.databinding.FragmentNotificationsBinding;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.material.bottomsheet.BottomSheetDialog;

import java.util.List;

public class MapFragment extends Fragment {

    private FragmentNotificationsBinding binding;

    GoogleMap mGoogleMap;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view=  inflater.inflate(R.layout.fragment_notifications, container, false);
        SupportMapFragment supportMapFragment=(SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.google_map);

        // Retrieve landmarks data from the database
        LandmarksDAO landmarksDAO = database.getDatabase(getContext()).landmarksDAO();
        LiveData<List<Landmarks>> landmarksLiveData = landmarksDAO.getAllLandmarks();

        supportMapFragment.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap googleMap) {
                MapsInitializer.initialize(getContext());
                mGoogleMap = googleMap;
                googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

                landmarksLiveData.observe(getViewLifecycleOwner(), landmarks -> {
                    // Loop through the landmarks and create markers
                    for (Landmarks landmark : landmarks) {
                        LatLng position = new LatLng(landmark.getLatitude(), landmark.getLongitude());
                        String title = landmark.getName();

                        googleMap.addMarker(new MarkerOptions().position(position).title(title));

                        CameraPosition cameraPosition = CameraPosition.builder()
                                .target(position)
                                .zoom(16)
                                .bearing(0)
                                .tilt(45)
                                .build();
                        googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
                    }
                });
            }
        });

        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }
}

database.java

package com.example.whereswaldo;

import android.content.Context;

import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@Database(entities = {Landmarks.class}, version = 1, exportSchema = false)
public abstract class database extends RoomDatabase {

    public abstract LandmarksDAO landmarksDAO();

    private static volatile database INSTANCE;
    private static final int NUMBER_OF_THREADS = 4;
    public static final ExecutorService databaseWriteExecutor = Executors.newFixedThreadPool(NUMBER_OF_THREADS);

    public static database getDatabase(final Context context) {
        if (INSTANCE == null) {
            synchronized (database.class) {
                if (INSTANCE == null) {
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(), database.class, "landmarks").createFromAsset("landmarks.db").build();
                }
            }
        }
        return INSTANCE;
    }
}

LandmarkDAO.java

package com.example.whereswaldo;

import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import androidx.room.Update;

import java.util.List;

@Dao
public interface LandmarksDAO {

    @Insert(onConflict = OnConflictStrategy.ABORT)
    public void insert(Landmarks landmarks);

    @Query("SELECT * FROM landmarks")
    LiveData<List<Landmarks>> getAllLandmarks();

    @Query("SELECT * FROM landmarks WHERE Name = :Name")
    LiveData<Landmarks> findLandmark(String Name);
}

I have tried putting Log comments to see where is the problem. It seems i am able to get into the landmarksLiveData.observe(getViewLifecycleOwner(), landmarks -> { but not the for loops afterwards.

I also tried adding this in the getDatabase() from database.java SupportSQLiteDatabase sdb = INSTANCE.getOpenHelper().getWritableDatabase();

Hence, the getAllLandmarks() returns nothing.

I would like to know where is the problem lying? Thank you!

1

There are 1 answers

1
zaid khan On

Your getAllLandmarks() function is returning nothing because there is nothing in the database and to add it you must create objects of all the landmarks

Landmarks landmark1 = new Landmarks(Sydney Opera House,Jorn Utzon, Peter Hall,Bennelong Point,Sydney NSW 200......);

Landmarks landmark2 = new Landmarks();

Landmarks landmark3 = new Landmarks(......);

ArrayList<Landmarks> landmarks = new ArrayList<Landmark>();
landmarks.add(landmark1);
landmarks.add(landmark2);
landmarks.add(landmark3);

for(Landmarks landmark : landmarks){
   landmarksDAO.insert(landmark)
}

Add this code before

   supportMapFragment.getMapAsync(new OnMapReadyCallback() {