9

I'm having a problem with active-android. I at trying to fetch user location, number of passengers and general direction. I want to save these to phone storage in a table called "Splits" using activeAndroid. But whenever I call the save() method i get a long list of errors. I have tried to reinstall the app, and changing my DB name in the manifest, but neither of those solutions worked. Please keep in mind I am very new to programming, so if possible, act like I'm 5. Thank you :)

Here is the LogCat output

11-03 23:27:51.094    2905-2905/dk.specialisering.splitcab E/SQLiteLog﹕ (1) no such table: Splits
11-03 23:27:51.115    2905-2905/dk.specialisering.splitcab E/SQLiteDatabase﹕ Error inserting passengers=1 Id=null startLong=9.92773733 direction=North startLat=57.0487396
    android.database.sqlite.SQLiteException: no such table: Splits (code 1): , while compiling: INSERT INTO Splits(passengers,Id,startLong,direction,startLat) VALUES (?,?,?,?,?)
            at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
            at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1118)
            at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:691)
            at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
            at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
            at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
            at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1589)
            at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1461)
            at com.activeandroid.Model.save(Model.java:153)
            at dk.specialisering.splitcab.MainActivity.save(MainActivity.java:127)
            at dk.specialisering.splitcab.MainActivity$1.onClick(MainActivity.java:37)
            at android.view.View.performClick(View.java:4475)
            at android.view.View$PerformClick.run(View.java:18786)
            at android.os.Handler.handleCallback(Handler.java:730)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5419)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
            at dalvik.system.NativeStart.main(Native Method)
11-03 23:27:51.175    2905-2905/dk.specialisering.splitcab E/SQLiteLog﹕ (1) no such table: Splits
11-03 23:27:51.175    2905-2905/dk.specialisering.splitcab E/SQLiteDatabase﹕ Error inserting passengers=1 Id=null startLong=9.92773733 direction=North startLat=57.0487396
    android.database.sqlite.SQLiteException: no such table: Splits (code 1): , while compiling: INSERT INTO Splits(passengers,Id,startLong,direction,startLat) VALUES (?,?,?,?,?)
            at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
            at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1118)
            at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:691)
            at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
            at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
            at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
            at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1589)
            at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1461)
            at com.activeandroid.Model.save(Model.java:153)
            at dk.specialisering.splitcab.MainActivity.save(MainActivity.java:127)
            at dk.specialisering.splitcab.MainActivity$1.onClick(MainActivity.java:37)
            at android.view.View.performClick(View.java:4475)
            at android.view.View$PerformClick.run(View.java:18786)
            at android.os.Handler.handleCallback(Handler.java:730)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5419)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
            at dalvik.system.NativeStart.main(Native Method)

Here is my Model class for the table

@Table(name = "Splits")
public class Splits extends Model {
    @Column(name = "startLat")
    public double startLat;
    @Column(name = "startLong")
    public double startLong;
    @Column(name = "passengers")
    public int passengers;
    @Column(name = "direction")
    public String direction;


    public Splits()
    {
        super();
    }

    public Splits(double startLat, double startLong, int passengers, String direction)
    {
        this.startLat = startLat;
        this.startLong = startLong;
        this.passengers = passengers;
        this.direction = direction;
    }

}

My activity

    package dk.specialisering.splitcab;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.media.Image;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.Spinner;
import android.widget.TextView;

import com.activeandroid.ActiveAndroid;

import dk.specialiserng.model.Splits;


public class MainActivity extends Activity {

    TextView textLat;
    TextView textLong;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ImageButton btn = (ImageButton)findViewById(R.id.imgBtn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                save();
            }
        });
        ActiveAndroid.initialize(this);
        populateSpinners();
        initializeLocation();
    }
        private class myLocationListener implements LocationListener{
            @Override
            public void onLocationChanged(Location location) {

                if(location != null) {
                    double pLong = location.getLongitude();
                    double pLat = location.getLatitude();

                    textLat.setText(Double.toString(pLat));
                    textLong.setText((Double.toString(pLong)));
                }

            }

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {

            }

            @Override
            public void onProviderEnabled(String provider) {

            }

            @Override
            public void onProviderDisabled(String provider) {

            }
        }


    public void populateSpinners()
    {
        Spinner passengerSpinner = (Spinner) findViewById(R.id.ddlPassengers);

        Spinner directionSpinner = (Spinner) findViewById(R.id.ddlDirection);
// Create an ArrayAdapter using the string array and a default spinner layout
        ArrayAdapter<CharSequence> passengerAdapter = ArrayAdapter.createFromResource(this,
                R.array.noOfPassengers, android.R.layout.simple_spinner_item);

        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
                R.array.splitDirection, android.R.layout.simple_spinner_item);
// Specify the layout to use when the list of choices appears
        passengerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
        passengerSpinner.setAdapter(passengerAdapter);

        directionSpinner.setAdapter(adapter);


    }

    public void initializeLocation()
    {

        textLat = (TextView) findViewById(R.id.textLat);
        textLong = (TextView) findViewById(R.id.textLong);

        LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        LocationListener ll = new myLocationListener();
        Location lastLocation = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);
        if (lastLocation != null)
        {
            textLat.setText(Double.toString(lastLocation.getLatitude()));
            textLong.setText(Double.toString(lastLocation.getLongitude()));
        }
    }

    public void save()
    {
        Spinner pasSpin = (Spinner)findViewById(R.id.ddlPassengers);
        Spinner dirSpin = (Spinner)findViewById(R.id.ddlDirection);
        double latitude = Double.parseDouble(textLat.getText().toString());
        double longitude = Double.parseDouble(textLong.getText().toString());
        int passengers = Integer.parseInt(pasSpin.getSelectedItem().toString());
        String direction = dirSpin.getSelectedItem().toString();

        Splits splits = new Splits(latitude, longitude, passengers, direction);

        splits.save();


    }

    }

My layout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="Your Position in latitude and longitude"
        android:id="@+id/textView"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:id="@+id/textLat"
        android:layout_below="@+id/textView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignRight="@+id/textView"
        android:layout_alignEnd="@+id/textView" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:id="@+id/textLong"
        android:layout_below="@+id/textLat"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignRight="@+id/textLat"
        android:layout_alignEnd="@+id/textLat" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="Number of Splitters in your party"
        android:id="@+id/textView2"
        android:layout_below="@+id/textLong"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <Spinner
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/ddlPassengers"
        android:layout_below="@+id/textView2"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:spinnerMode="dropdown" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="The direction you will be going"
        android:id="@+id/textView3"
        android:layout_below="@+id/ddlPassengers"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <Spinner
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/ddlDirection"
        android:layout_below="@+id/textView3"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:spinnerMode="dropdown" />

    <ImageButton
        android:layout_width="200dp"
        android:layout_height="90dp"
        android:scaleType="fitCenter"
        android:id="@+id/imgBtn"
        android:src="@drawable/gotitbtn"
        android:background="@android:color/transparent"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"

        />

</RelativeLayout>

I hope someone can help, I know I posted a bunch, but I am getting desperate at this point. Thanks in advance

Matt Baech
  • 404
  • 11
  • 23

6 Answers6

17

although late, hope this help.

from official page of ActiveAndroid in github:

"This is because ActiveAndroid only generates the schema if there is no existing database file. In order to "regenerate" the schema after creating a new model, the easiest way is to uninstall the app from the emulator and allow it to be fully re-installed. This is because this clears the database file and triggers ActiveAndroid to recreate the tables based on the annotated models in the project."

mehdi
  • 912
  • 7
  • 20
  • 1
    Yes, that is true, tho you can (and I think should) use **** in manifest (as documentation suggests) and increment X when you want to recreate your AA database (default X = 1). – Arthez Feb 10 '16 at 18:13
  • 1
    `uninstall the app from the emulator and allow it to be fully re-installed` is worked.. Thanks.. – Shailendra Madda Feb 22 '16 at 08:28
  • this might be an issue if you already have an app that uses 1 table, while sending an update, it will just crash and burn. It might be worthwhile to just use aa_db_version update as steven suggested –  Feb 05 '20 at 02:34
11

Increment your AA_DB_VERSION in your manifest. That will force ActiveAndroid to regenerate your schema.

Steven
  • 1,214
  • 3
  • 18
  • 28
1

it seems you have forgotten to call super() on your model class in the constructor function:

public Splits(double startLat, double startLong, int passengers, String direction)
{
    super();
    this.startLat = startLat;
    this.startLong = startLong;
    this.passengers = passengers;
    this.direction = direction;
}

Another possibility is that you didn't declare your Model class in your Manifest file.

Eduardo
  • 214
  • 3
  • 9
  • "If a constructor does not explicitly invoke a superclass constructor, the Java compiler automatically inserts a call to the no-argument constructor of the superclass." https://docs.oracle.com/javase/tutorial/java/IandI/super.html Also: "ActiveAndroid will look through all your files to find your Model classes." – nasch Oct 21 '15 at 17:40
0

It seems that there is no table called Splits into your db. If you have made changes on your database and you are testing your application in one real device (not emulator) you will need to remove the application from the device (or at least its data) to refresh your database. Hope it helps =)

Luciano Rodríguez
  • 2,239
  • 3
  • 19
  • 32
  • 1
    As stated in the question I have already tried that. No luck there. I thought that my Model class would create the table for me? Or did I get activeandroid wrong – Matt Baech Nov 03 '14 at 23:29
  • This is YET ANOTHER one of those things that works on an emulator but not on the device. – Captain Kenpachi Dec 07 '16 at 12:36
0

You have probably misconfigured ActiveAndroid. Check this tutorial, in the Common Questions section.

x0z
  • 36
  • 4
0

This initialization code:

    ActiveAndroid.initialize(this);

goes into the Application class. So you could extend the Application class and use the initialization within the OnCreate of that. Like

public class MyApplication extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        ActiveAndroid.initialize(this);
    }
}

Be sure that you're using this application class in the AndroidManifest.xml as your application. ie,

<application android:name="com.exampleapp.MyApplication" ...>

Refer: https://github.com/pardom/ActiveAndroid/wiki/Getting-started

NT_
  • 2,216
  • 1
  • 18
  • 23