Hallo
In SQl wird bei der Where Klausel nur "=" für den vergleich benutzt nicht "=="
aber wie so benutzt du nicht die schon in android vorhandenen abfrage methoden rawQuery ist auf jeden fall langsamer als die query.
Hallo
In SQl wird bei der Where Klausel nur "=" für den vergleich benutzt nicht "=="
aber wie so benutzt du nicht die schon in android vorhandenen abfrage methoden rawQuery ist auf jeden fall langsamer als die query.
Wie so Tabellen Nahmen Dynamisch?
du erstellst datensätze und nicht Tabellen.
Die Tabellen werden verbunden Über Id's haste eine Tabelle Hersteller, Modell, MotorTyp
wenn ein neues auto hinzukommt wird nicht eine neue Tabelle erstellt sondern ein Datensatz.
Ich glaube du weist nicht was eine Db ist und wie man sie verwendet und was eine DB leisten kann.
hier mal was für den Anfang
Hallo
Warum machst du das so umständlich mit mehreren Datenbank Dateien?
Ich würde eine DB erstellen mit mehrerenTabellen und die untereinander in Beziehung setzen.
Somit hast du auch alle Vorteile die eine DB bietet. Ich würde dir vorschlagen dich erstmal etwas mit Datenbanken und ein bisschen SQL zu beschäftigen.
Denn das Herzstück ist deine Db und die ListView dient dabei hauptsächlich zum Anzeigen.
Du machst somit eine Abfrage an die Db und bekommt genau die Daten im Cursor die du anzeigen willst.
Hallo @SteLAN willkommen im Forum.
Das diene App sofort abstürzt liegt daran das du In Zeile 22 u 23 im Klassenrumpf zwei Variablen erstellst,
und auch gleich durch einen Methoden aufruf Initialisieren willst.
Das geht im Klassenrumpf nicht.
Im KlassenRumf können keine Methoden aufgerufen werden.
Definieren ja das setzen der Variable solltest du in der onCreate machen.
String UsernameExist = getString(R.string.UsernameExist);
String Success = getString(R.string.Success);
Habe deinen Code geändert zu mindestens sollte er jetzt starten.
package net.stelan.registrierung;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import net.stelan.registrierung.Model.User;
public class MainActivity extends AppCompatActivity {
//String Variable
String UsernameExist;
String Success;
//FireBase
FirebaseDatabase database;
DatabaseReference users;
EditText edtUsername, edtPassword, edtMail;
Button btnSingUp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
UsernameExist = getString(R.string.UsernameExist);
Success = getString(R.string.Success);
//FireBase
database = FirebaseDatabase.getInstance();
users = database.getReference("Users");
edtUsername = (EditText) findViewById(R.id.edtUsername);
edtPassword= (EditText) findViewById(R.id.edtPassword);
edtMail = (EditText) findViewById(R.id.edtMail);
btnSingUp = (Button) findViewById(R.id.btnSingUp);
btnSingUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final User user = new User(edtUsername.getText().toString(),
edtPassword.getText().toString(),
edtMail.getText().toString());
users.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.child(user.getUsername()).exists())
Toast.makeText(MainActivity.this, UsernameExist, Toast.LENGTH_LONG).show();
else {
users.child(user.getUsername()).setValue(user);
Toast.makeText(MainActivity.this, Success, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
//add
}
});
}
});
}
}
Alles anzeigen
Bin mir aber nicht sicher ob deine app auch so läuft wie du es erwartest.
Denn der Lintner wird ja nur aufgerufen wenn sich in der DB etwas ändert sonst nicht.
somit dürfte nichts mit der DB pasieren.
Hallo glaube das war eine schwere Geburt für dich.
Schön das es nun läuft und uns das auch sagst.
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.util.Log;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import javax.net.ssl.SSLPeerUnverifiedException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
public class MainActivity extends Activity {
// Inistailierung
Button Send;
EditText IP;
EditText Port;
TextView Answer;
EditText Message;
private String ip_address;
private int port = 11880;
private String temp
private SSLSocket socket = null;
private BufferedReader in = null;
private BufferedWriter out = null;
private final String TAG = "TAG";
private char keystorepass[] = "key12345".toCharArray();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Send = (Button) findViewById(R.id.btnSend);
IP = (EditText) findViewById(R.id.etIP);
Port = (EditText) findViewById(R.id.etPort);
Answer = (TextView) findViewById(R.id.tvAnswer);
Message = (EditText) findViewById(R.id.etMessage);
Send.setClickable(true);
Send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
if (IP.getText().toString().equals(null) || Port.getText().toString().equals(null)){
}else {
temp = Message.getText().toString();
if (temp == null){
temp = "Es wurde keine Nachricht eingegeben";
}
port = Integer.parseInt(Port.getText().toString());
ip_address = IP.getText().toString();
try{
new Thread() {
@Override
public void run() {
try {
KeyStore ks = KeyStore.getInstance("BKS");
InputStream keyin = getApplicationContext().getResources().openRawResource(R.raw.neuserverkeypem);
ks.load(keyin,keystorepass);
org.apache.http.conn.ssl.SSLSocketFactory socketFactory = new org.apache.http.conn.ssl.SSLSocketFactory(ks);
socketFactory.setHostnameVerifier(socketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
socket = (SSLSocket)
socketFactory.createSocket(new Socket(ip_address,port), ip_address, port, false);
socket.startHandshake();
printServerCertificate(socket);
printSocketInfo(socket);
out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
chat(temp);
} catch (UnknownHostException e) {
Log.i(TAG,"Unknown host");
//System.exit(1);
} catch (IOException e) {
Log.i(TAG,"No I/O");
e.printStackTrace();
//System.exit(1);
} catch (KeyStoreException e) {
Log.i(TAG,"Keystore ks error");
//System.exit(-1);
} catch (NoSuchAlgorithmException e) {
Log.i(TAG,"No such algorithm for ks.load");
e.printStackTrace();
//System.exit(-1);
} catch (CertificateException e) {
Log.i(TAG,"certificate missing");
e.printStackTrace();
//System.exit(-1);
} catch (UnrecoverableKeyException e) {
Log.i(TAG,"unrecoverableKeyException");
e.printStackTrace();
//System.exit(-1);
} catch (KeyManagementException e) {
Log.i(TAG,"key management exception");
e.printStackTrace();
//System.exit(-1);
}
}
}.start();
}
catch(Exception ex){}
}
}
});
}
private void printServerCertificate(SSLSocket socket) {
try {
Certificate[] serverCerts =
socket.getSession().getPeerCertificates();
for (int i = 0; i < serverCerts.length; i++) {
Certificate myCert = serverCerts[i];
Log.i(TAG,"====Certificate:" + (i+1) + "====");
Log.i(TAG,"-Public Key-\n" + myCert.getPublicKey());
Log.i(TAG,"-Certificate Type-\n " + myCert.getType());
System.out.println();
}
} catch (SSLPeerUnverifiedException e) {
Log.i(TAG,"Could not verify peer");
e.printStackTrace();
System.exit(-1);
}
}
private void printSocketInfo(SSLSocket s) {
Log.i(TAG,"Socket class: "+s.getClass());
Log.i(TAG," Remote address = "
+s.getInetAddress().toString());
Log.i(TAG," Remote port = "+s.getPort());
Log.i(TAG," Local socket address = "
+s.getLocalSocketAddress().toString());
Log.i(TAG," Local address = "
+s.getLocalAddress().toString());
Log.i(TAG," Local port = "+s.getLocalPort());
Log.i(TAG," Need client authentication = "
+s.getNeedClientAuth());
SSLSession ss = s.getSession();
Log.i(TAG," Cipher suite = "+ss.getCipherSuite());
Log.i(TAG," Protocol = "+ss.getProtocol());
}
public void chat(String temp){
String message = temp;
// send id of the device to match with the image
try {
out.write(message+"\n");
out.flush();
} catch (IOException e2) {
Log.i(TAG,"Read failed");
System.exit(1);
}
// receive a ready command from the server
try {
final String line = in.readLine();
runOnUiThread(new Runnable() {
@Override
public void run() {
Answer.setText("SERVER SAID: "+line);
}
});
//Log.i(TAG,line);
} catch (IOException e1) {
Log.i(TAG,"Read failed");
System.exit(1);
}
}
}
Alles anzeigen
Da würde ich mal auf den USB Treiber vom PC Tippen.
Hallo mit der Chinaversion habe ich mich etwas gerirrt. Das war für eine Wear mit API 28. Habe es im Studio nochmal nach gesehen.
Ich denke auch bei anderen Emulatoren ist das das selbe. Alle Emulatoren bilden ein eigenes Handy nach. Und genau für dieses Simulierte Handy erstellt der Herstelle des Emulator eine Rom. Da wirst du nie eine komplett andere Hersteller Rom drauf bekommen.
Auch wenn der Hersteller des Emulator ein Samsung anbietet ist es nur in den ich sage mal äußeren Eigenschaften dem Samsung gleich . Ram, Display, Hardware Button. …
Intern ist es immer das gleiche. Denn du hast nie die gleiche CPU, GPU …
Das wirst du nicht hin bekommen.
Es ist und bleibt immer eine Simulation und die ist nie so wie das Original.
Hallo Micha
hast du auch unter Oreo die Permission gesetst vorher brauchte man die nicht.
ZitatApps targeting API Build.VERSION_CODES.P or later must request the permission Manifest.permission.FOREGROUND_SERVICE in order to use this API.
wenn du unter api 28 entwickelst soltest du die setzen.
Eigentlich ist dafür die Klasse asynctask besser geeignet. Als die klassische thread Lösung und Handler der im ui thread läuft.
An Sonden gibt es da noch runOnUiThread
https://stackoverflow.com/ques…-runonuithread-in-android
Aber multithreading gibt es in C++ doch auch . Ok die Klasse asynctask gibt es dort nicht. So was wie Handler schon.
aber dein temp ist immer noch final und lokal wird wohl somit nicht im Thread und somit in der chat Methode ankommen. prüfe das mit einen LOG
auch der aufruf der chat in zeile 59 hilft da nicht ist fralsch .
mache es so wie ich gesagt habe global im Klassenrupf und ohne final
das chat muss wieder in den Thread.
denn zu dem zeitpunkt sind deine "in" u "out" Reader noch nicht gesetzt.
ja da haben wir es doch.
in der chat Metode willst du eine Ausgabe auf den Bildschirm machen das geht in einem Thread nicht . im Thread kein zugriff auf View Elemente.
zeile 163
Answer.setText("SERVER SAID: "+line);
so nun zeige noch m deinen code
die metoden printSocketInfo u printServerCertificate werden eigentlich ausgeführt .
ob die chat ausgefürt wird kann ich nicht sehen da du da keine logs hast bzw haste sie auskommentiert.
du musst nach dem Tread noch irgent etwas machen was zum absturtz fürt was du uns noch nicht gezeigt hast.
auch gibt es am anfang ein paar probleme mit einer Lib libEGL
Kann ich nicht genau sagen teste es einfach. Ich benutze nicht die möglichkeit den Listner im xml anzugeben.
Ja ok aber final oder const gibt es auch in c ist fast das selbe.
auch die sichtbarkeit von Variablen ist in C++ OOP nicht anders.
deine temp Variable im Thread ist lehr.
ich wolte eigentlich die ausgabe der Logs haben.
Lasse auch mal die Toast in dem Thread weg.
in einen Thread solten keine Bildschirmausgaben sein. zumindestens geht es nicht so einfach wie du es machst.
https://stackoverflow.com/ques…android-toast-in-a-thread
Wecher fehler kommt denn ?
zeige mal dein LogCat.
teste mit dem debugger wo es abstürtzt.
was mir noch komisch vorkommt ist in deiner printServerCertificate Methode.
und zwas das "System.out.println();"
erstens was soll das ?
zweitens bist du in einem Thread und da kannst du keine ausgaben auf die UI machen,
ist zwar auf die Console binn mir da arber auch nicht sicher
auch das ist eigentlich sinnlos
if (temp == null){
}
Ps. Ok die neue zuweisung für dein temp hast du weggelassen weil du den string final hast und somit keine zweite zuweisung machen kanst.
lasse das final weg.
und auserdem wird die Variable temp nicht in den Thread vorhanden, sichtbar sein das ist ein neuer Block und Methode.
mache sie auch Global wie deine "ip" Variable.
Hallo das v ist eine View und die beinhaltet nicht deine Resourcen.
InputStream keyin = v.getResources().openRawResource(R.raw.neuserverkeypem);
etweder
InputStream keyin = this.getResources().openRawResource(R.raw.neuserverkeypem);
oder
InputStream keyin = getampplicationcontext().getResources().openRawResource(R.raw.neuserverkeypem);
müsstes es denke ich heissen den du bist ja imThread.
ansonsten mus das v natürlich bleiben.
Ps. das ist auch falsch
der erste Parameter muss auch der context sein
Toast.makeText(getampplicationcontext(), "Bitte IP und Port eingeben", Toast.LENGTH_LONG).show();
Hallo
Erstmal eins du kannst nicht innerhalb einer Methode eine neue Methode machen.
Das heißt du bist noch in der onCreate und erstellst eine neu Methode das geht nicht.
Außerdem wo hast du den denn Button erstellt den du benutzen willst um die playSound(View v) aufzurufen . auch wenn du im XML die Eigenschaft „onClick“ benutzt musst du den Button in der onCrate bekannt machen mit findViewById.
public class MainActivity extends AppCompatActivity{
private SoundPool soundpool;
private int sound1, sound2, sound3, sound4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt = (Button) findViewById(R.id.button1); // hier deine ID eintragen
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) //Ab SDK 21 funktioniert die Erstellung von SoundPool anders
{
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) //Bei der App: Speech
.setUsage(AudioAttributes.USAGE_MEDIA)
.build();
soundpool = new SoundPool.Builder()
.setMaxStreams(4)
.setAudioAttributes(audioAttributes)
.build();
}
else
{
soundpool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);
}
sound1 = soundpool.load(this, R.raw.a, 1);
sound2 = soundpool.load(this, R.raw.b, 1);
sound3 = soundpool.load(this, R.raw.c, 1);
sound4 = soundpool.load(this, R.raw.d, 1);
}
public void playSound(View v)
{
switch(v.getId())
{
case R.id.button_sound1:
soundpool.play(sound1,1,0,0,1, 1);
break;
case R.id.button_sound2:
soundpool.play(sound2,1,0,0,1, 1);
break;
case R.id.button_sound3:
soundpool.play(sound3,1,0,0,1, 1);
break;
case R.id.button_sound4:
soundpool.play(sound4,1,0,0,1, 1);
break;
}
}
}
Alles anzeigen
Es gibt doch auch für den emulator ein Image für die China Version api 28 glaube ich.
Das schon mal getestet.
Zitat
Also ich lese die Antwort auf die Frage die hier im SO gestellt wurde genau so wie ich es auch gesagt habe. Der emulator stellt ein Android Handy dar und für dieses ist ein Image erstellt worden. So wie für jedes Handy eine genau passende rom erstellt wird.
Selbst wenn Teile von der Rom gehen sollten oder du zum laufen bekommst.
Was bringt es dir, es ist doch nicht das original. Sicher kannst du dir dann doch nicht sein. l