Meraklis56 Δημοσ. 4 Νοεμβρίου 2012 Share Δημοσ. 4 Νοεμβρίου 2012 Χρειάζομαι τα φώτα σας παιδιά.Καταρχας θέλω να δημιουργήσω μια βάση δεδομένων 2 πεδίων με λέξεις,μια στα αγγλικα και τι σημαίνει στα Ελληνικά.Και θέλω το πρόγραμμα να τις εμφανίζει (τυχαία). Δοκίμασα την βάση δεδομένων να την χτίσω πάνω σε Excel αρχείο,αλλά αντιμετώπισα αρκετά προβλήματα και δεν βρήκα λυση στο ίντερνετ. Η επόμενη μου σκέψη είναι να την χτίσω πάνω σε sqlite που έχει το Android,μόνο που θέλω με κάποιο τρόπο να εισάγω τα δεδομένα απο το pc και όχι να αρχίσω να γράφω λέξεις στο κινητό. Μπορώ να το κάνω με κάποιο τρόπο με την sqlite η με κάποια άλλη βάση δεδομένων; Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
migf1 Δημοσ. 5 Νοεμβρίου 2012 Share Δημοσ. 5 Νοεμβρίου 2012 Αν αυτό που θέλεις είναι όλο κι όλο αυτό που περιγράφεις, είναι πολύ απλό να γίνει σε οποιαδήποτε γλώσσα από τις δημοφιλείς, χωρίς καν να χρησιμοποιήσεις εξωτερικά 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... Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Meraklis56 Δημοσ. 5 Νοεμβρίου 2012 Μέλος Share Δημοσ. 5 Νοεμβρίου 2012 Ωχ,έχεις δίκιο.Πως δεν σκέφτηκα ένα απλό txt αρχείο fail Θα ψαχτώ αύριο,θα το μετατρέψω σε java που είμαι πιο εξοικιωμένος και θα το μελετήσω/εφαρμόσω.Αν αντιμετωπίσω κάποιο πρόβλημα θα γράψω εδώ. Σε ευχαριστώ για τον χρόνο σου Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Directx Δημοσ. 5 Νοεμβρίου 2012 Share Δημοσ. 5 Νοεμβρίου 2012 (επεξεργασμένο) Και μια εκδοχή σε 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 Έξοδος: Επεξ/σία 6 Νοεμβρίου 2012 από Directx 1 Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
adi32 Δημοσ. 5 Νοεμβρίου 2012 Share Δημοσ. 5 Νοεμβρίου 2012 Υπαρχει τροπος να τρεξει runtime της Access σε android ? Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Directx Δημοσ. 5 Νοεμβρίου 2012 Share Δημοσ. 5 Νοεμβρίου 2012 Όχι, το Android προσφέρει ως Β.Δ. του μια βελτιστοποιημένη έκδοση της SQLite. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα