Προς το περιεχόμενο

Δημιουργία Βάσης Δεδομένων σε Android


Meraklis56

Προτεινόμενες αναρτήσεις

Χρειάζομαι τα φώτα σας παιδιά.Καταρχας θέλω να δημιουργήσω μια βάση δεδομένων 2 πεδίων με λέξεις,μια στα αγγλικα και τι σημαίνει στα Ελληνικά.Και θέλω το πρόγραμμα να τις εμφανίζει (τυχαία).

Δοκίμασα την βάση δεδομένων να την χτίσω πάνω σε Excel αρχείο,αλλά αντιμετώπισα αρκετά προβλήματα και δεν βρήκα λυση στο ίντερνετ.

Η επόμενη μου σκέψη είναι να την χτίσω πάνω σε sqlite που έχει το Android,μόνο που θέλω με κάποιο τρόπο να εισάγω τα δεδομένα απο το pc και όχι να αρχίσω να γράφω λέξεις στο κινητό.

Μπορώ να το κάνω με κάποιο τρόπο με την sqlite η με κάποια άλλη βάση δεδομένων;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν αυτό που θέλεις είναι όλο κι όλο αυτό που περιγράφεις, είναι πολύ απλό να γίνει σε οποιαδήποτε γλώσσα από τις δημοφιλείς, χωρίς καν να χρησιμοποιήσεις εξωτερικά API.

 

Σου το παραθέτω σε C. Αν δεν είσαι εξοικειωμένος με το Android NDK μπορείς να δοκιμάσεις να το μετατρέψεις σε Java (θα σου βγει και πολύ πιο μικρός ο κώδικας).

 

Σημείωσε μόνο πως η συνάρτηση που φορτώνει τα ονόματα είναι over-complicated στον κώδικά μου (και επίσης πρόχειρα γραμμένη) γιατί αντί να ενημερώνει την dbase καθώς διαβάζει το αρχείο, το διαβάζει πρώτα μονοκόμματα σε ένα buffer, κατόπιν μετράει τις αλλαγές γραμμών σε αυτό το buffer και τις μετατρέπει σε '\0' και τέλος ενημερώνει την dbase μέσα από το "πειραγμένο" αυτό buffer.

 

Όταν τα αρχείο είναι μικρό, ενδεχομένως να αργεί περισσότερο έτσι, αλλά όσο πιο μεγάλο είναι τα αρχείο τόσο ταχύτερος γίνεται ο συγκεκριμένος τρόπος.

 

 

 

 

Κώδικας (σε spoiler)...

 

 

 

>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdbool.h>    // C99
#include <stdint.h>    // C99

#define MAXLEN_FLINE    (255+1)
#define MAXLEN_WORD    (38+1)

#define pressENTER()                                \
   do{                                    \
       int mYcHAr;                            \
       printf( "press ENTER..." );                    \
       while ( (mYcHAr=getchar()) != '\n' && mYcHAr != EOF )        \
           ;                            \
   }while(0)


typedef struct DBaseElem {
   char enWord[MAXLEN_WORD];
   char grWord[MAXLEN_WORD];
} DBaseElem;

typedef struct DBase {
   uintmax_t     nelems;
   DBaseElem    *data;
}DBase;

/*********************************************************//**
* @par Prototype:
* int s_tokenize( char *s, char *tokens[], const int ntoks, const char *delims )
*
* @brief    Break a string up to ntoks tokens and store them in *tokens[]
*         (uses any char in delims as separator between tokens).
* @return    The number of tokens, or 0 on failure
*************************************************************
*/
int s_tokenize( char *s, char *tokens[], int ntoks, const char *delims )
{
   int i = 0;

   /* sanity checks */
   if ( !s || !tokens || !delims ) {
       return 0;
   }
   if ( !*s || !*delims || ntoks < 1 ) {
       return 0;
   }

   tokens[ 0 ] = strtok(s, delims);
   if ( NULL == tokens[0] )
       return 0;
   for (i=1; i < ntoks && (tokens[i]=strtok(NULL, delims)) != NULL; i++)
       ;    /* void */

   return i;
}

/*********************************************************//**
* @brief    Return the size of a file in bytes, or 0 on error
*        (cannot be more than LONG_MAX).
*************************************************************
*/
uintmax_t f_size( const char *fname )
{
   long int size;
   FILE     *fp;

   if ( NULL == (fp = fopen(fname, "rb")) )    /* binary mode */
       return 0;

   if ( 0 != fseek(fp, 0, SEEK_END) ) {
       fclose(fp);
       return 0;
   }

   size = ftell(fp);
   fclose(fp);

   return (size < 0) ? 0 : (uintmax_t)size;
}

/********************************************************//**
*
************************************************************
*/
bool dbase_cleanup( DBase *dbase )
{
   if ( !dbase )
       return false;

   dbase->nelems = 0;
   if ( dbase->data ) {
       free( dbase->data );
       dbase->data = NULL;
   }

   return true;
}

/********************************************************//**
*
************************************************************
*/
#define MAX_TOKENS    2

bool dbase_load( DBase *dbase, const char *fname )
{
   FILE    *fp = NULL;
   char     *bufTemp = NULL;
   uintmax_t fsize = 0;
   char    stringTemp[MAXLEN_FLINE] = {'\0'};

   // sanity checks
   if ( !dbase || !fname || !*fname )
       return false;

   // start fresh
   memset( dbase, 0, sizeof(DBase) );

   // get size of specified file
   fsize = f_size(fname);
   if ( 0 == fsize )
       return false;

   // open the file
   if ( NULL == (fp=fopen(fname, "rb")) )
       return false;

   // assign cleared memory for fsize+1 chars to bufTemp
   if ( NULL == (bufTemp = calloc(fsize+1, sizeof(char)) ) )
       return false;

   // read file into bufTemp
   if ( fsize != fread(bufTemp, sizeof(char), fsize, fp) ) {
       free( bufTemp );
       return false;
   }
   fclose( fp );

   // count '\n's in bufTemp and replace them with '\0'
   for (uintmax_t i=0; i < fsize; i++)
   {
       if ( '\n' == bufTemp[i] ) {
           bufTemp[i] = '\0';
           (dbase->nelems)++;
       }
   }
   if ( '\0' != bufTemp[fsize] )
       (dbase->nelems)++;

   // assign cleared memory for dbase->nelems to dbase->data
   if ( NULL == (dbase->data=calloc(dbase->nelems, sizeof(DBaseElem))) ) {
       free( bufTemp );
       return false;
   }

   // get dbase elements from bufTemp
   uintmax_t i = 0, j = 0;
   while ( i < fsize && j < dbase->nelems )
   {
       char *tokens[MAX_TOKENS];

       strncpy( stringTemp, &bufTemp[i], MAXLEN_WORD-1 );
       if ( MAX_TOKENS != s_tokenize(stringTemp, tokens, MAX_TOKENS, "\t\r \v\f") ) {
           dbase_cleanup( dbase );
           free( bufTemp );
           return false;
       }
       strncpy( dbase->data[j].enWord, tokens[0], MAXLEN_WORD-1 );
       strncpy( dbase->data[j].grWord, tokens[1], MAXLEN_WORD-1 );

       i += 1 + strlen( &bufTemp[i] );
       j++;
   }

   free( bufTemp );

   return true;
}

/********************************************************//**
*
************************************************************
*/
bool dbase_print_elem_at_i( const DBase *dbase, uintmax_t i )
{
   if ( !dbase )
       return false;

   if ( i > dbase->nelems - 1 )
       return false;

   printf( "%*s | %-*s\n",
       MAXLEN_WORD, dbase->data[i].enWord,
       MAXLEN_WORD, dbase->data[i].grWord
       );

   return true;
}

#if 0
/********************************************************//**
* UNUSED
************************************************************
*/

bool dbase_print( const DBase *dbase )
{
   if ( !dbase )
       return false;

   for (uintmax_t i=0; i < dbase->nelems; i++) {
       printf( "%*s | %-*s\n",
           MAXLEN_WORD, dbase->data[i].enWord,
           MAXLEN_WORD, dbase->data[i].grWord
           );
   }

   return true;
}
#endif

/*********************************************************//**
*
************************************************************/
int main( void )
{
   DBase dbase;            // needs initialization

   srand( time(NULL) );

   if ( !dbase_load(&dbase, "wordsEnGr.txt") ) {
       puts( "*** fatal error occured while loading the dbase ***" );
       pressENTER();
       exit( EXIT_FAILURE );
   }

//    dbase_print( &dbase );
   dbase_print_elem_at_i( &dbase, rand() % dbase.nelems );
   dbase_cleanup( &dbase );

   pressENTER();
   exit( EXIT_SUCCESS );
}

 

 

 

Παράδειγμα αρχείου "wordsEnGr.txt"...

>
hello        γεια
people        άνθρωποι
rose        τριαντάφυλλο
bear        αρκούδα
car        αυτοκίνητο
apple        μήλο
rocket        πύραυλος
scientist    επιστήμονας

 

Παράδειγμα εξόδου...

>
                scientist | επιστήμονας

press ENTER...

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ωχ,έχεις δίκιο.Πως δεν σκέφτηκα ένα απλό txt αρχείο :X fail

Θα ψαχτώ αύριο,θα το μετατρέψω σε java που είμαι πιο εξοικιωμένος και θα το μελετήσω/εφαρμόσω.Αν αντιμετωπίσω κάποιο πρόβλημα θα γράψω εδώ.

Σε ευχαριστώ για τον χρόνο σου

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Και μια εκδοχή σε native (Android) Java..

 

 

Καταρχήν..

 

* Κάθε γραμμή του αρχείου κείμενου μας (μορφής UTF-8) περιέχει δυο λέξεις που διαχωρίζονται μεταξύ τους με τον ειδικό χαρακτήρα tab (\t).

* Η πρώτη λέξη της γραμμής δηλώνεται στα ελληνικά ενώ η δεύτερη στα αγγλικά (πχ. γάτα cat).

* Το αρχείο των λέξεων μας (το λεξικό μας δηλαδή -words.txt) αποθηκεύεται στο assets folder του project μας, η ανάγνωση του γίνεται μέσο της συνάρτησης getResources().getAssets().open η οποία επιστρέφει ένα InputStream.

* Για να διαβάσουμε άνετα γραμμή προς γραμμή το αρχείο, το φορτώνουμε σε ένα BufferedReader (μέσο InputStreamReader) και χρησιμοποιούμε την BufferedReader.ReadLine().

* Για να διαχωρίσουμε τις λέξεις κάθε γραμμής που διαβάζουμε χρησιμοποιούμε την strLine.split("\t") η οποία επιστρέφει κάθε αλφαριθμητικό που χωρίζεται με τον ειδικό χαρακτήρα tab στον πίνακα strData.

* Τα περιεχόμενα του strData αποθηκεύονται για περαιτέρω χρήση από το πρόγραμμα σε ένα Vector τύπου Pair (η χρήση του Vector container και του Pair δεν είναι σε καμία περίπτωση δεσμευτική - ότι βολεύει τον καθένα).

* Με την ολοκλήρωση της ανάγνωσης όλων των γραμμών του αρχείου (BufferedReader.ReadLine() == null) δημιουργούμε μια γεννήτρια ψευδό τυχαίων αριθμών (RNG) και ζητούμε μια θέση από το Vector μας.

* Προβάλουμε το Pair του Vector μας σε δυο TextView controls της φόρμας μας.

 

Προσοχή:

 

Σε περίπτωση που δηλώσουμε πολλές λέξεις στο λεξικό μας, καλό είναι να τοποθετήσουμε των κώδικα φορτώματος σε ένα AsyncTask ώστε η διαδικασία φόρτωσης του λεξικού να μην μπλοκάρει το UI Thread μας.

 

Το πρόγραμμα μπορεί να περιέχει bugs ή άλλες αβλεψίες.

 

>
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;
import java.util.Vector;
import android.app.Activity;
import android.os.Bundle;
import android.util.Pair;
import android.widget.TextView;

public class RndwordActivity extends Activity {
   /** Called when the activity is first created. */
   @Override        
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);

       Vector<Pair<String, String>> wordList = new Vector<Pair<String, String>>();

       try
       {                                   
           BufferedReader lnReader = 
                   new BufferedReader(new InputStreamReader(
                           getResources().getAssets().open("words.txt")));

           /* Read each lnReader line words into wordList vector, until EOF.. */
           for( ;; )
           {            
               final String strLine = lnReader.readLine();

               if(strLine == null)
                   break; // EOF!

               /* 
                * Record format: 
                *     Greek word \t English word\n
                */
               final String[] strData = strLine.split("\t");

               wordList.add(new Pair<String, String>(strData[0], strData[1]));
           }

           lnReader.close();

           /* Pick a random word from wordList.. */
           Random RNG = new Random();

           final int wordToShow = RNG.nextInt(wordList.size() - 1);

           /* Show English & Greek word to user..*/
           final Pair<String, String> Words = wordList.get(wordToShow);

           ((TextView)findViewById(R.id.textViewGr)).setText(Words.first);
           ((TextView)findViewById(R.id.textViewEng)).setText(Words.second);
       }
       catch(IOException e)
       {            
           e.printStackTrace();
       }        
   }
}

 

Αρχείο εισόδου (σε ASSETS folder -θα πρέπει να είναι μορφής UTF-8):

>
λέξη    word
γάτα    cat
νίκη    victory

 

Έξοδος:

post-41640-0-69809200-1352099246_thumb.png

 

 

Επεξ/σία από Directx
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...