2017-09-03 1 views
0

J'ai créé un outil de sélection de date où l'utilisateur peut choisir une date et une heure à l'aide de la bibliothèque borax12. Cela ouvre une boîte de dialogue où l'utilisateur peut fixer une date et quand ils appuyez sur OK, il fixe la date dans cette méthode:Comment puis-je stocker chaque date sélectionnée depuis datepicker dans la mémoire ou la base de données sur Android?

@Override 
    public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth,int yearEnd, int monthOfYearEnd, int dayOfMonthEnd) { 
     to.set(Calendar.YEAR, year); 
     to.set(Calendar.MONTH, monthOfYear); 
     to.set(Calendar.DAY_OF_MONTH, dayOfMonth); 

     from = Calendar.getInstance(); 
     from.set(Calendar.YEAR, yearEnd); 
     from.set(Calendar.MONTH, monthOfYearEnd); 
     from.set(Calendar.DAY_OF_MONTH, dayOfMonthEnd); 

     String date = "You picked the following date: From- "+dayOfMonth+"/"+(++monthOfYear)+"/"+year+" To "+dayOfMonthEnd+"/"+(++monthOfYearEnd)+"/"+yearEnd; 
     dateTextView.append(new StringBuilder().append(date) + "\n"); 
    } 

Cela fonctionne bien que les dates s'annexées au dateTextView. Mais comment puis-je stocker chaque date dans un arraylist à chaque fois et en mémoire sur le téléphone des utilisateurs ou une base de données?

+1

Près double en même nombre d'heures d'auteur à part: [? Comment puis-je vérifier en permanence si les dates sont entrées depuis et vers sont égaux à la date actuelle pour l'année prochaine] (https://stackoverflow.com/ q/46025288/642706) –

Répondre

0

Créez simplement un Arraylist (List<String> list= new Arraylist()) lors de l'initialisation de la classe et utilisez list.add() chaque fois que vous en avez besoin. Il va créer plusieurs instances de chaînes dans votre liste.

Vous pouvez enregistrer à SharedPreferences ou un DB comme SqLite (ou même dans un fichier ou un serveur), décidez ce que vous voulez.

+0

Merci si j'utilise SharedPreferences et que l'utilisateur ferme toutes les applications sur son téléphone ces données seront-elles encore stockées? – Sam

+0

Oui, c'est le but des préférences partagées, de conserver les données même si l'utilisateur ferme l'application et rouvre. Si vous devez conserver les données même si l'application est désinstallée, essayez de conserver le code sur un fichier (qui peut également être supprimé du gestionnaire de fichiers sur le téléphone s'il n'est pas privé) ou un serveur distant. – Gil

2

La classe Calendar est maintenant héritée, supplantée en Java par les classes java.time. Pour Android, voir les puces ci-dessous. Pour une valeur de date uniquement sans heure et sans fuseau horaire, utilisez LocalDate.

LocalDate from = LocalDate.of(year , monthOfYear , dayOfMonth) ; 

Pour obtenir une nouvelle valeur basée sur une valeur existante, utilisez un TemporalAdjuster. La classe TemporalAdjusters fournit plusieurs implémentations pratiques. Apparemment, vous voulez lastDayOfYear.

LocalDate to = from.with(TemporalAdjusters.lastDayOfYear()) ; 

Pour Java, je suggère le suivi de cette paire de LocalDate objets en utilisant la classe LocalDateRange trouvés dans le projet ThreeTen-Extra. Mais ce code n'est pas back-porté sur Android. Vous pourriez vouloir créer votre propre version simple de cette classe pour combiner la paire.

package com.example.javatimestuff; 

import org.threeten.bp.Duration; 
import org.threeten.bp.LocalDate; 

public class DateRange 
{ 

    private LocalDate start, stop; 
// private Duration duration ; // Cache value if calling `getDuration` frequently. 
// private String stringed ; // Cache value if calling `toString` frequently. 

    public DateRange (LocalDate startArg , LocalDate stopArg) 
    { 
     this.start = startArg; 
     this.stop = stopArg; 
    } 

    public LocalDate getStart() 
    { 
     return this.start; 
    } 

    public LocalDate getStop() 
    { 
     return this.stop; 
    } 

    public Period toPeriod() 
    { 
     Period p = Period.between(this.start , this.stop); 
     return p; 
    } 

    @Override 
    public String toString() 
    { 
     // Per ISO 8601 standard. 
     // https://en.wikipedia.org/wiki/ISO_8601#Time_intervals 
     String s = this.start.toString() + "/" + this.stop.toString(); 
     return s; 
    } 

    static public LocalDate parse (String input) { // Obviously in real work you would make this safer: check for nulls, check for empty string, check for two parts, catch `DateTimeParseException`. 
     String[] parts = input.split("/"); 
     LocalDate start = LocalDate.parse(parts[0]) ; 
     LocalDate stop = LocalDate.parse(parts[1]) ; 
     DateRange dr = new DateRange(start , stop) ; 
     return dr ; 
    } 
} 

Appelez cette classe par le constructeur.

DateRange dr = new DateRange(from , to) ; 

dans un magasin de type ListDateRange, notre classe personnalisée.

List<DateRange> ranges = new ArrayList<>() ; 
ranges.add(dr) ; 

Pour le stockage, serialize the List. Voir: Wikipedia & Oracle Tutorial.


A propos java.time

Le cadre java.time est construit en Java 8 et versions ultérieures. Ces classes supplantent les vieilles classes de date-heure legacy gênantes telles que java.util.Date, Calendar, & SimpleDateFormat. Le projet Joda-Time, maintenant en maintenance mode, conseille la migration vers les classes java.time.

Pour en savoir plus, voir le Oracle Tutorial. Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310.

Où obtenir les classes java.time?

  • Java SE 8, Java SE 9, et plus tard
    • intégré.
    • Partie de l'API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et Java SE 7
    • Une grande partie de la fonctionnalité de java.time est de retour à Java 6 Ported .
  • Android
+0

Merci pour cela, ça a l'air bien et ce que je cherche. Je ne le trouve nulle part comment puis-je compiler la bibliothèque ThreeTen-Extra dans build.gradle sur Android? Aussi, si je sérialiser l'Arraylist peut-il encore être accédé si l'utilisateur ferme l'application? – Sam

+0

@Samantha Lire les liens que j'ai publiés. Un sur Comment utiliser ThreeTenABP, et un sur la sérialisation. Aussi: [Wikipedia] (https://en.wikipedia.org/wiki/Serialization) & [Oracle Tutorial] (https://docs.oracle.com/javase/tutorial/jndi/objects/serial.html). –

+0

Ahh merci donc ThreeTenABP est le même que ThreeTen-Extra? J'ai lu que c'est fondamentalement le même que l'utilisation de Joda sur Android. https://peirr.com/jodatime-vs-threetenabp-android-datetime-tool-comparison/ – Sam