2014-11-03 78 views
7

我遇到了active-android的問題。 我試圖獲取用戶位置,乘客人數和總體方向。 我想使用activeAndroid將這些保存到名爲「Splits」的表中的手機存儲中。 但是每當我打電話給save()的方法,我都會得到一長串的錯誤。 我試圖重新安裝應用程序,並在清單中更改我的數據庫名稱,但這些解決方案都無效。 請記住我很新的節目,所以如果可能的話,像我5.謝謝:)ActiveAndroid SQLite異常'沒有這樣的表'

這裏是logcat的輸出

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) 

這裏是我的模型類的表

@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; 
    } 

} 

我的活動

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(); 


    } 

    } 

我的佈局

<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> 

我希望有人可以幫忙,我知道我張貼了一大堆,但我在這一點上越來越絕望。 在此先感謝

回答

15

雖然晚了,希望對此有所幫助。

從ActiveAndroid的官方網頁在github上:

「這是因爲ActiveAndroid 只生成架構如果沒有現有數據庫文件。爲了在創建新模型後「重新生成」模式,最簡單的方法是將從模擬器中卸載應用程序,並允許其完全重新安裝。這是因爲這將清除數據庫文件和觸發ActiveAndroid重新創建基於項目的註釋模型中的表。」

+1

是的,那是對的,你可以(而且我認爲應該)使用** <元數據android:name =「AA_DB_VERSION」android:value =「X」/> **在清單中(如文檔建議)並在您想要重新創建AA數據庫(默認X = 1)時增加X. – Arthez 2016-02-10 18:13:06

+1

'從模擬器卸載應用程序,並允許它被完全重新安裝'工作..謝謝.. – 2016-02-22 08:28:02

0

似乎沒有表稱爲分裂到您的分貝。如果您對數據庫進行了更改,並且您正在一個真實設備(而非仿真器)中測試應用程序,則需要從設備(或至少其數據)中刪除應用程序以刷新數據庫。希望它有幫助=)

+1

如前所述在這個問題我已經嘗試過,沒有運氣那裏我認爲我的模型類會爲我創建表? 或者我得到activeandroid錯誤 – 2014-11-03 23:29:21

+0

這還沒有其中一個在模擬器上的作品之一,但沒有 – 2016-12-07 12:36:21

0

您可能錯誤地配置了ActiveAndroid。在「常見問題」部分查看此tutorial

0

這個初始化代碼:

ActiveAndroid.initialize(this); 

進入應用程序類。所以你可以擴展Application類並在OnCreate中使用初始化。 像

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

確保你使用這個應用程序類在AndroidManifest.xml爲您的應用程序。即,

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

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

1

似乎你已經忘記了就在構造函數模型類調用super():

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

另一種可能是你沒有在你的Manifest文件中聲明你的Model類。

+0

「如果構造函數沒有顯式調用超類構造函數,則Java編譯器會自動將調用插入到超類的無參構造函數中。」https://docs.oracle.com/javase /tutorial/java/IandI/super.html另外:「ActiveAndroid會瀏覽你所有的文件來找到你的Model類。」 – nasch 2015-10-21 17:40:19

9

增量您AA_DB_VERSION在你的清單。這將迫使ActiveAndroid再生架構。

+0

確切地說,這件事幫助了我,甚至他們建議在文檔中的這件事。 – Arthez 2016-02-10 18:14:11