2017-07-21 14 views
0

Da ich das Bild in der Datenbank der SQLite von Kamera-Schaltfläche eingeben kann, fügen Sie es in Hinzufügen ein.Wie eingeführtes Bild in SQLite XAML UWP

private async void AddButton_Click (object sender, RoutedEventArgs e) 
{ 
    var selectedDate = Data1.Date.UtcDateTime; 

    DataBaseHelper Db_Pet = new DataBaseHelper(); 

    if (txtnombre.Text != "" & txtchip.Text !="" & txtraza.Text !="" & SelectedgeneroText !="" & txtcolor.Text != "" ) 
    { 
     Db_Pet.Insert(new Mascota(txtnombre.Text, txtchip.Text, txtraza.Text, SelectedgeneroText, txtcolor.Text,selectedDate)); 
    } 
    else 
    { 
     MessageDialog md = new MessageDialog("Enter your pet"); 
     await md.ShowAsync(); 
    } 
} 

private async void btcapture_Click (object sender, RoutedEventArgs e) 
{ 
    CameraCaptureUI cameraUI = new CameraCaptureUI(); 
    cameraUI.PhotoSettings.Format = CameraCaptureUIPhotoFormat.Jpeg; 
    cameraUI.PhotoSettings.CroppedSizeInPixels = new Size(150, 150); 
    StorageFile photo = await cameraUI.CaptureFileAsync(CameraCaptureUIMode.Photo); 

    if (photo == null) 
    { 
     return; 
    }//cierre del if 

    IRandomAccessStream stream = await photo.OpenAsync(FileAccessMode.Read); 
    BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream); 
    SoftwareBitmap softwareBipMap = await decoder.GetSoftwareBitmapAsync(); 

    SoftwareBitmap softwareBitmapBGR8 = SoftwareBitmap.Convert(softwareBipMap, 
     BitmapPixelFormat.Bgra8, 
     BitmapAlphaMode.Premultiplied); 

    SoftwareBitmapSource bitmapSource = new SoftwareBitmapSource(); 

    await bitmapSource.SetBitmapAsync(softwareBitmapBGR8); 

    Capture.Source = bitmapSource; 
} 
+0

Ich bin verwirrt über das, was Sie fragen. Könnten Sie bitte Einzelheiten zu Ihrem Problem erfahren? Was "wie eingeführtes Bild" bedeutet? –

+0

Ich möchte das Bild in der SqLite – user3682557

Antwort

0

Wenn Sie nur Bilder, die auf SQLite einsetzen möchten, können Sie das Bild in Byte-Array konvertieren und es in einer BLOB-Spalte einer SQLite-Tabelle speichern. SQLite3 kann einen Blob-Datentyp speichern. Einzelheiten dazu, wie Sie vorgehen, finden Sie unter this blog. Und Sie könnten auch das Bild-Byte-Array in Base64-Zeichenfolge codieren und es als String-Spalte in Tabelle speichern. Details zum Codieren und Decodieren von Base64 finden Sie unter this document.

Und ich empfehle Ihnen, nur die Bildpfade in der Datenbank zu speichern, nicht das Bild selbst.

Weitere details bitte verweisen diese similar thread.

0

Ich empfehle nicht, eine byte[] in der Datenbank zu speichern. Das Speichern des Bildes direkt in der Datenbank ist nur dann sinnvoll, wenn die Datenbank für andere Benutzer mit anderen Benutzern zugänglich ist, die keine lokale Datei des Bildes haben. Die Konvertierung der Bilddaten in eine byte[] oder Base64 ist langsamer als die Verwendung des Dateisystems.

Stattdessen, wie Sunteen erwähnt, speichern Sie das Bild in LocalFolder und dann können Sie eine einfache Zeichenfolge des Dateipfads in der Datenbank speichern.

Sie können den Dateipfad problemlos vom StorageFile-Objekt abrufen.

Als Beispiel habe ich Ihren Code aktualisiert, so dass es die StorageFile von CaptureFileAsync in der LocalFolder der App gespeichert. Dann können Sie einfach diesen Pfad verwenden, um das Image auf der Benutzeroberfläche festzulegen und diese Zeichenfolge in dem hinzuzufügenden Datenbankelement zu speichern.

Code verwenden, hier ist der Ansatz:

// a private field on the class level 
private string _currentImageFilePath; 

private async void btcapture_Click(object sender, RoutedEventArgs e) 
{ 
    var cameraUI = new CameraCaptureUI(); 
    cameraUI.PhotoSettings.Format = CameraCaptureUIPhotoFormat.Jpeg; 
    cameraUI.PhotoSettings.CroppedSizeInPixels = new Size(150, 150); 
    var photo = await cameraUI.CaptureFileAsync(CameraCaptureUIMode.Photo); 

    if (photo == null) return; 

    // Create a unique filename 
    var uniqueFileName = $"{Guid.NewGuid()}.jpg"; 

    // Save the photo file in the app's Local folder 
    var savedFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(uniqueFileName, CreationCollisionOption.GenerateUniqueName); 

    // -- Now you have an easy to store string using the file's Path property -- // 

    // 1 - Use this string to save to the database 
    _currentImageFilePath = savedFile.Path; 

    // 2 - You can also use the same file path to set the <Image/> source 
    // you do NOT need to decode the image manually 
    Capture.Source = new BitmapImage(new Uri(savedFile.Path)); 
} 

private async Task SaveToDatabase() 
{ 
    var selectedDate = Data1.Date.UtcDateTime; 

    var Db_Pet = new DataBaseHelper(); 

    if (txtnombre.Text != "" & txtchip.Text != "" & txtraza.Text != "" & Selectedgenero.Text != "" & txtcolor.Text != "") 
    { 
     var petToInsert = new Mascota 
     { 
      Name = txtnombre.Text, 
      Chip = txtchip.Text, 
      ImageFilePath = _currentImageFilePath 
     }; 

     Db_Pet.Insert(petToInsert); 
    } 
    else 
    { 
     await new MessageDialog("Enter your pet").ShowAsync(); 
    } 
} 

Beachten Sie, dass einige Szenarien gibt es, wo in der Datenbank die Daten direkt Speichern macht Sinn: Wenn Sie diese Datenbank verwenden, wo die App leider nicht das Bild haben lokal gespeicherte Dateien (denken Sie an SQL Server mit vielen Benutzern oder Wiederherstellungsszenarien)

+0

herauskommen Dieser Code private Aufgabe save() hat nichts mit der Schaltfläche Hinzufügen zu tun – user3682557

+0

Richtig, es ist nicht so gemeint. Sie würden diese SaveToDatabaseAsync-Aufgabe später aufrufen, wenn der Benutzer zum Speichern bereit ist. Ich schrieb es, um zu markieren, dass Sie use_currentImageFilePath verwenden, wenn es Zeit ist, den Datensatz zu speichern. –

+0

Wenn das nicht klar ist, verschieben Sie einfach den gesamten Code in Ihre Save-Buttons, klicken Sie auf den Event-Handler, aber architektonisch ist es gut, eine Aufgabe zu haben, die das Speichern erledigt. Dann rufen Sie einfach 'warten SaveToDatabaseAsync()' in Ihrem SaveButton_OnClick –