2014-11-03 20 views
7

Aktif-android ile ilgili bir sorun yaşıyorum. Kullanıcı konumunu, yolcu sayısını ve genel yönü almaya çalışıyorum. Bunları telefona depolamak için activeAndroid kullanarak "Splits" adlı bir tabloya kaydetmek istiyorum. Ancak, save() yöntemini her aradığımda, uzun bir hata listesi alıyorum. Uygulamayı yeniden yüklemeyi ve DB adımı bildirimde değiştirmeyi denedim, ancak bu çözümlerden hiçbiri işe yaramadı. ben 5. gibiyim mümkünse bu yüzden, hareket, programlamaya çok yeni unutmayın teşekkürler :) İşte ActiveAndroid SQLite istisnası 'Hayır böyle bir tablo'

LogCat çıkışı İşte

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) 

benim Model sınıfı içindir tablo

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

} 

Benim aktivite

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 düzen

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

Umarım birileri yardımcı olabilir, biliyorum bir demet yayınladım, ama bu noktada çaresizleşiyorum. Teşekkürler

cevap

15

geç olsa da, bu yardımı umarız. github içinde ActiveAndroid resmi sayfasından

:

"hayır mevcut veritabanı dosyasıvarsa ActiveAndroid sadece şema oluşturur olmasıdır.Yeni bir model oluşturduktan sonra şemayı "yeniden oluşturmak" için, en kolay yol uygulamasının emülatörden uygulamayı kaldırması ve'un tamamen yeniden yüklenmesine izin vermektir. Bu veritabanı dosyasını siler ve projede açıklamalı modellere dayalı tabloları yeniden ActiveAndroid tetikler olmasıdır."

+1

Evet, bu doğru, yapabileceğiniz (ve bence) kullanmanız gerekir ** ** manifest dosyasında (dokümantasyon önerileri gibi) ve AA veritabanınızı yeniden oluşturmak istediğinizde X değerini artırın (varsayılan X = 1). – Arthez

+1

'emülatörden uygulamayı kaldırın ve tam olarak yeniden kurulmasına izin verin' işe yaradı' .. Teşekkürler. –

0

Görünüşe göre db'nize Bölmeler adı verilen bir tablo yok. Veritabanınızda değişiklikler yaptıysanız ve uygulamanızı tek bir gerçek cihazda (emülatör değil) test ediyorsanız, veritabanınızı yenilemek için uygulamayı cihazdan (veya en azından verilerini) kaldırmanız gerekir. Umarım yardım eder =)

+1

belirtildiği gibi Ben zaten denedim soru.Şu şans yok Benim model sınıf benim için tablo oluşturacağını düşündüm? Veya aktiveandroid yanlış aldın mı –

+0

Bu bir emülatör üzerinde çalışır ama üzerinde çalışan şeylerden YET –

0

Muhtemelen ActiveAndroid'i yanlış yapılandırmışsınızdır. Ortak Sorular bölümünde bu tutorial'u kontrol edin.

0

Bu başlatma kodu:

ActiveAndroid.initialize(this); 

Uygulama sınıfına girer. Böylece Uygulama sınıfını genişletebilir ve başlatma işlemini bunun OnCreate içinde kullanabilirsiniz.

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

gibi size uygulama olarak AndroidManifest.xml bu uygulama sınıfını kullandığınızdan emin olun. yani

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

bakın: https://github.com/pardom/ActiveAndroid/wiki/Getting-started

1

Eğer yapıcı işlevi modeliniz sınıfında super() çağırmak için unutmuş görünüyor:

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

başka olasılık değil mi yani Model sınıfınızı Manifest dosyanıza bildirin.

+0

"Bir kurucu bir üst sınıf yapıcısını açıkça çağırmazsa, Java derleyicisi otomatik olarak süper sınıfın bağımsız değişken yapıcısına bir çağrı ekler." https://docs.oracle.com/javase /tutorial/java/IandI/super.html Ayrıca: "ActiveAndroid, Model sınıflarınızı bulmak için tüm dosyalarınıza göz atacaktır." – nasch

9

Artış sizin AA_DB_VERSION Manifest'inizde. Bu senin şema yeniden oluşturmak için ActiveAndroid zorlayacaktır.

+0

Tam olarak, bu şey bana belgede bu şeyi önermelerine yardımcı oldu. – Arthez

İlgili konular