2014-11-03 82 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