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

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

Δημοσ.

Γεια σας φτιάχνω ένα κουίζ για android με webview (δηλαδή html, javascript) και θα ήθελα να μάθω πως μπορώ να αποθηκεύω μια μεταβλητή javascript σε ένα αρχείο, μια βάση δεδομένων ή οτιδήποτε άλλο ώστε να μπορεί ο χρήστης να βλέπει πάντα το high score του.

Δηλαδή αν ο χρήστης κλείσει την εφαρμογή και μετά ξαναμπει σε αυτή να υπάρχει το high score.

 

Δημοσ.

Αν αποθηκευεις μόνο έναν αριθμό μπορείς να χρησημοποιήσεις shared preferences.

 

Με αυτό το τρόπο μπορείς να υποστηρίξεις και πολλούς χρήστες (με βάση το όνομα) Είναι dictionary(string key, object value) όπου key θα βάλεις το όνομα του χρήστη.

  • Like 1
Δημοσ.

Το δεύτερο μου ακούγεται καλό μιας που δεν χρειάζομαι ολόκληρη βάση δεδομένων για έναν αριθμό.

Το θέμα είναι... τα shared preferences μπορούν να πάρουν τιμή μέσα από το webview και το αντίστροφο;

Δημοσ.

Μπορείς να πάρεις τα δεδομένα από την webview στην java και μετά να τα αποθηκευσεις.

Δες εδώ

http://stackoverflow.com/questions/16109817/android-requesting-data-in-webview-via-javascript

 

Γενικά στο goolge υπάρχει άπειρο υλικό ειδικά για android. Αμα ξέρεις αγγλικά μπορείς να βρεις ότι θέλεις βλέπε stackoverflow.

Δημοσ.

Αγγλικά δεν ξέρω αλλά δόξα τον Θεό καταλαβαίνω μια χαρά τέτοια θέματα.

Εκεί ψάχνω κατά κύριο λόγο απλώς καμιά φορά η απάντηση είναι κομπλέ σε κάποιον ενώ σε άλλον δε δουλέυει :P

Δημοσ.

Αυτό που κάνω εδώ γίνεται ή .... :P

package com.example.moviequiz;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.os.Build;

public class MainActivity extends ActionBarActivity {

	SharedPreferences highScore = this.getSharedPreferences("highscore", Context.MODE_PRIVATE);
	SharedPreferences.Editor score_edit = highScore.edit();
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
		WindowManager.LayoutParams.FLAG_FULLSCREEN);
		setContentView(R.layout.activity_main);
		
		WebView myWebView = (WebView) this.findViewById(R.id.webView1);
		myWebView.loadUrl("file:///android_asset/www/index.html");
		WebSettings settings = myWebView.getSettings();
		settings.setJavaScriptEnabled(true);
		myWebView.addJavascriptInterface(new PlayerScore(), "EditScore");
		
		

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	/**
	 * A placeholder fragment containing a simple view.
	 */
	public static class PlaceholderFragment extends Fragment {

		public PlaceholderFragment() {
		}

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {
			View rootView = inflater.inflate(R.layout.fragment_main, container,
					false);
			return rootView;
		}
	}
	
	public class PlayerScore{
		@JavascriptInterface
		public void setScore(String x){
			score_edit.putString("score",x);
			score_edit.commit();
		}
		
		@JavascriptInterface
		public void getScore(String x){
			x = highScore.getString("highscore", "");
		}
	}

}

Αυτά με ενδιαφέρουν βασικά...

SharedPreferences highScore = this.getSharedPreferences("highscore", Context.MODE_PRIVATE);
SharedPreferences.Editor score_edit = highScore.edit();
myWebView.addJavascriptInterface(new PlayerScore(), "EditScore");
public class PlayerScore{
		@JavascriptInterface
		public void setScore(String x){
			score_edit.putString("score",x);
			score_edit.commit();
		}
		
		@JavascriptInterface
		public void getScore(String x){
			x = highScore.getString("highscore", "");
		}
}

Από τη στιγμή που πρόσθεσα αυτά εδώ στον κώδικα η εφαρμογή δεν τρέχει :D

Δημοσ.

Έχω τρελαθεί πραγματικά... ψάχνω ώρες!!!!!

Δεν έχω βρει τίποτα... νομίζω ότι βρήκα μόνο ότι μπορεί να γίνει με ένα plugin του phonegap, αλλά τα παραδείγματα πιο πολύ με μπέρδεψαν παρά με βοήθησαν....

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

Με τα sharedpreferences δεν είδα χαΐρι αποφάσισα να κάνω αυτό που θέλω με sqlite....

 

βλέπει κανείς κάποιο λάθος στον παρακάτω javascript κώδικα; (γιατί ο δικός μου εγκέφαλος μάλλον έχει λιώσει...)


var db = null;

function openDB(){
	db = openDatabase("Highscore.db","1.0", "Highscore DB", 2 * 1024 * 1024);
	db.transaction(function(tx){
		tx.executeSql('CREATE TABLE IF NOT EXISTS highscore (id unique, score)');
		tx.executeSql('SELECT * FROM highscore',[],function(tx,rs){
			if(rs.rows.length < 1){
				tx.executeSql('INSERT INTO highscore(id,score) VALUES (1,"0")');
			}
		});
	});
}

function checkScore(){
	var stored_score ="";
	db.transaction(function(tx){
		tx.executeSql('SELECT * FROM hishscore', [], function(tx, rs){
			var len = rs.rows.length;
			if(len != 0){
				stored_score = rs.rows.item(0).score;
			}
		});
	});
	return stored_score;
}

function updateScore(x){
	db.transaction(function(tx){
		tx.executeSql('UPDATE highscore SET score =' + x + ' WHERE id = ' + 1,[]);
	});
}

Επεξ/σία από rafinos
Δημοσ.

Τώρα κάποιο συντακτικό λάθος μου μιλάς (γιατί δεν νομίζω να μου λες για drop table) αλλά δεν μπορώ να καταλάβω για ποιο πράγμα μιλάς :P

  • Moderators
Δημοσ.

Αυτό που σου λέει είναι να προσέχεις τα SQL injections και να προσέχεις τι τρέχεις στη βάση...

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

Οκ παιδιά το έκανα...
 

var db = null;

function openDB(){
    db = openDatabase("Highscore.db","1.0", "Highscore DB", 2 * 1024 * 1024);
    db.transaction(function(tx){
        tx.executeSql('CREATE TABLE IF NOT EXISTS highscore (id unique, score)');
        tx.executeSql('SELECT * FROM highscore',[],function(tx,rs){
            if(rs.rows.length < 1){
                tx.executeSql('INSERT INTO highscore(id,score) VALUES (1,"0")');
            }
        });
    });
}

function checkScore(callback){
    db.transaction(function(tx){
        tx.executeSql('SELECT * FROM highscore WHERE id = ' + 1,[],function(tx,rs){
            var row;
            if(rs.rows.length > 0){
                row = rs.rows.item(0);
                callback(row.score);
            }
        });
    });
}

function updateScore(x){
    db.transaction(function(tx){
        tx.executeSql('UPDATE highscore SET score =' + x + ' WHERE id = ' + 1,[]);
    });
}

function returnScore(x){
    $('input[name="high_score_hidden"]').val(x);
}

Καλώ την checkScore(returnScore);
και εν συνεχεία παίρνω σε μια μεταβλητή αυτό $('#high_score_hidden').val();
Δεν ξέρω αν είναι ότι πιο σωστό αλλά δουλεύει

Επεξ/σία από rafinos

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

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

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

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

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

Σύνδεση

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

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