2015-05-05 10 views
14

Ho la più semplice delle app che ho pensato di provare sul mio dispositivo prima che diventassi troppo assorbito. Tuttavia, sto ricevendo il messaggio di errore più strano quando lo eseguo sul mio iPhone (come indicato per l'emulatore sul mio macbook).La tabella non ha colonne (pubbliche) solo sul dispositivo reale

La tabella non ha colonne (pubbliche).

Sto usando il PCL SQLite.Net e l'ho creato da git hub in quanto ho avuto qualche problema con esso non avendo la piattaforma dll per IOS altrimenti.

Codice rilevante.

Nei miei modelli ho questo:

public class Setting 
{ 
    [PrimaryKey, AutoIncrement] 
    public long Id { get; set; } 

    [Indexed] 
    public string Key { get; set; } 

    public string Value { get; set; } 

} 

Il codice che genera questo messaggio di errore è la semplice:

using (SQLiteConnection db = GetCon()) { 

      db.CreateTable<Setting>(); 
} 

ma a mio parere la cosa più strana è che questo codice funziona bene su l'emulatore ma blocca l'applicazione sullo stesso iPhone.

Se qualcuno ha qualche idea che sarebbe grandiosa.

EDIT: Questo errore è gettato sulla libreria SQLite.Net-PCL in this file linea 380, ma solo sul dispositivo e non sull'emulatore.

+0

Come si ottiene questo messaggio? Questa è un'eccezione? In tal caso, puoi pubblicare la traccia dello stack? – Grisha

+0

Si tratta di un errore, sfortunatamente sul dispositivo in xamarin studio non riesco a ottenere l'errore di rimanere sullo schermo per molto tempo prima che interrompe l'esecuzione del programma. Probabilmente un bug nel programma, tuttavia avendo esaminato il codice, quell'eccezione interna viene generata nella libreria sqlite-net che collegherò nella domanda (quando github ritorna online). @Grisha –

+0

@DanielCasserly il fatto che funzioni sul tuo mac e non sul dispositivo potrebbe avere a che fare con esso in realtà un * simulatore * invece di un emulatore * reale *. Hai detto di averlo creato da solo invece di usare il Nuget, forse il problema sta lì, quale problema l'hai usato in altro modo? E come stanno passando nella connessione specifica della piattaforma? – Jack

risposta

9

Per gli altri a cui questo può interessare, ho trovato la risposta al mio problema. Il problema era che il Tipo non aveva alcuna proprietà (il tipo in questione era la semplice classe del modello). Sapendo che per essere spazzatura ho trovato i seguenti link che ha dato ulteriori informazioni che mi riguardano, in questo post nel caso in cui i link si esauriscono:

Type.GetProperties returning nothing

Nota: Fare attenzione con il gruppo linker

Se stai costruendo con linker abilitato potresti aver bisogno di usare la classe da qualche parte, in modo che non venga strappata al momento della compilazione. A volte, solo l'istanziazione della classe nel codice non è sufficiente, il linker può rilevare che l'istanza non viene mai utilizzata e la rimuoverà comunque.

http://developer.xamarin.com/guides/ios/advanced_topics/linker/

Il processo di collegamento può essere personalizzato tramite il linker comportamento discesa in Opzioni progetto. Per accedere a questa fare doppio clic sul progetto iOS e passare a iOS build> Opzioni Linker, come illustrato di seguito (vedi link per i dettagli)

ho per ora lasciato che fosse scollegato, però, lo farò prova prima del rilascio per far sì che il linker ignori queste classi. Grazie per tutto il vostro aiuto.

+0

Penso che il problema abbia più a che fare con la configurazione del rilascio, quindi il fatto che si tratti di un dispositivo (sto solo supponendo che tu abbia usato una configurazione diversa per il dispositivo). – Jack

+0

@Jack non proprio la configurazione è esattamente la stessa. Penso che il simulatore ignori le impostazioni di collegamento tbh. –

+0

OK Ho pensato che fosse così perché su Android ho riscontrato lo stesso problema ma c'era solo nella configurazione di rilascio. – Jack

0

Ho trovato il mio problema era solo un errore di programmazione (non così sottile).Stavo lavorando con la classe TypeInfo e voluto usare il metodo di connessione Sqlite:

CreateTable (Type type); 

Quello che avevo in mano era un esempio TypeInfo, che avevo bisogno di riconvertire al System.Type. Accidentalmente, senza pensare, ho utilizzato il metodo GetType() invece del metodo AsType() che è ovvio quando ci pensate. L'indizio che ho trovato era nel messaggio di eccezione insieme al messaggio OP era System.Runtime ha proprietà pubbliche?

var type = table.TypeInfo.AsType(); 
// var type = table.TypeInfo.GetType(); *WRONG* 
connection.CreateTable(type); 
Problemi correlati