2010-10-12 21 views
2

Quelle est la meilleure façon de stocker nsdecimalnumbers dans une base de données? Les types numériques comme float, real et double sont supprimés, car il est important de préserver la précision de l'utilisation des devises.comment nsdecimalnumber devrait-il être stocké dans la base de données?

Les deux alternatives que j'ai considérées sont des cordes et stockent deux ints, l'un tenant la mantisse et l'autre tenant l'exposant. Le défi auquel fait face cette dernière approche est que je ne vois pas un moyen facile d'extraire la mantisse et l'exposant du nsdecimalnumber. Je peux obtenir NSDecimal de NSDecimalNumber, mais les propriétés de mantisse et d'exposant semblent être privées! Peut-être que je peux inverser nombre = (mantisse * 10^exposant), mais y a-t-il une meilleure façon de le faire?

L'exigence que j'ai est que j'aurais besoin d'effectuer des opérations de somme globale sur ce champ dans la base de données. Si je stocke comme une chaîne, peut-être effectuer ce calcul serait plus difficile. J'aurais encore besoin d'écrire une fonction personnalisée pour additionner une mantisse et un exposant dans la base de données, alors c'est peut-être toujours aussi lourd. Editer: Je peux accéder à l'exposant, mais la mantisse est conservée d'une manière étrange ... le piquer dans le débogueur révèle qu'il s'agit d'un tableau de court (ints).

+0

Vous vous rendez compte que NSDecimal est défini dans le NSDecimal.h, visible si vous double-cliquez tout en maintenant cmd? Il est également répertorié dans la documentation, bien qu'il indique que les champs sont privés. –

+0

Oui, je sais que je peux y accéder maintenant, mais la mantisse est gardée comme un tableau de petites occurrences. Je suppose que c'est le détail de la mise en œuvre de long signé non signé? Comment lirait-on de manière fiable à partir d'un tableau de court terme? – Ying

Répondre

1

NSDecimalNumber est conforme à NSCoding, vous pouvez donc encoder avec encodeWithCoder: avant de l'ajouter à votre base de données, puis le décoder en utilisant initWithCoder: lors de la récupération à partir de la base de données.

Voir le Archives and Serializations Programming Guide, plus précisément "Encoding and Decoding Objects" pour plus de détails sur l'utilisation des encodeurs.

+0

Ceci est une proposition intéressante. Que se passe-t-il si la base de données n'est pas seulement regardée par l'iPhone, mais synchronisée sur un serveur où elle peut être utilisée avec PHP ou Java? – Ying

+0

Ce n'est pas aussi simple, mais vous pouvez le faire fonctionner. Probablement le meilleur moyen est d'écrire votre propre encodeur et de créer les classes de décodeur (ou désérialiseur) équivalentes en Java et PHP. Cependant, maintenant vous êtes revenu à votre question originale, car vous devez décider comment encoder correctement les composants de NSDecimal. –